iOS本地存储的方式

本文介绍了iOS中五种本地存储方式:NSUserDefaults、plist、归档、SQLite3和CoreData。详细讲解了每种方式的特点、适用场景及优缺点。例如,NSUserDefaults适合存储轻量级数据,而CoreData是苹果官方提供的综合性数据库,提供了对象关系映射,适用于复杂的数据模型。在实际开发中,SQLite3通常通过FMDB库进行操作,提供了高效的数据存储和检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS本地存储的方式

1.NSUserDefaunts (Preference偏好设置)
2.plist存储
3.归档
4.SQLite3
5.CoreData**

应用沙盒
Document :适合存储重要的数据,iTunes同步应用时会同步该文件下的内容。(比如游戏中的存档)。
Library/Caches:适合存储体积大,不需要备份的非重要数据,iTunes不会同步该文件。
tmp:保存应用的临时文件,用完就删除,系统可能在应用没在运行时删除该目录下的文件,iTunes不会同步。

获取沙盒路径
Document:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentFilePath = paths.fistObject;

1.NSuserDefault
NSuserDefault 适合存储轻量级的本地数据,支持的数据类型:NSNumber,NSString,NSDate,NSArray,NSDictionary,BOOL,NSData
沙盒路径为Library/Preferences
文件格式为.plist

优点
1.不需要关心文件名;
2.快速进行键值对存储;
3.直接存储基本数据类型;

缺点
1.不能存储自定义数据
2.取出的数据是不可变的

-void)userDefaultSave{
   
NSArray *testArray = @[@"test1",@"test1",@"test3"];
[ [NSUserDefaults standardUserDefaults] setObject:testArray forKey:@"arraykey"];
[[NSUserDefaults standarUserDefaults] synchronize];
}
- (void)userDefaultLoad{
   
NSArray *testArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"arrayKey"];
NSLog(@"%@",testArray);
}

封装调用

#pragma mark 保存本地数据
void saveUserInfo(NSString *keyName,id valueName)
{
   
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    [def setObject:valueName forKey:keyName];
    [def synchronize];
}
#pragma mark 获取本地数据
NSString *  getUserInfo(NSString *keyName)
{
   
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    return [def objectForKey:keyName];
}
#pragma mark 删除本地数据
void removeUserInfo(NSString *key)
{
   
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    [def removeObjectForKey:key];
    [def synchronize];
}

2.plist存储

plist支持的数据类型:NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NsNumber,NSDate;
不支持BOOL,而且最外层好像要用NSArray或NSDictionary;

- (void)plistSave{
   
NSSring *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirecttory,NSUserDomainMask,YES).firstObject;
NSString *filePath = [cachPath stringByAppendingPathComponent:"testPlist.plist"];
NSMutableDitionary *dict = [NSMutableDictionary dictionary];
dict setObject:@"jack" forKey:@"name";
dict setObject:@"18" forKey:@"age";
[dict writeToFile:filepath atomically:YES];
}
- (void)plistLoad{
   
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
NSString *filePath = [cachePath stringByAppendingPathComponent:@"testPlist.plist"];

NSDictionary *t = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSLog(@"%@",t);
}

3.归档
存储自定义对象

1.首先新建Person类,并遵守NSCoding协议
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject<NSCoding>

@property (nonatomic,strong) NSString *name;
@property (nonatomic,strong) NSString *age;

@end

NS_ASSUME_NONNULL_END

2.实现协议方法
#import "Person.h"

@implementation Person

- (instancetype)initWithCoder:(NSCoder *)coder
{
   
self = [super init];
if (self) {
   
_name = [coder decodeObjectForKey:@"name"];
_age = [coder decodeObjectForKey:@"age"];
}

return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
   
[coder encodeObject:self.name forKey:@"name"];
[coder encodeObject:self.age forKey:@"age"];
}


@end

3.归档解档

#pragma mark - 一个对象归档
- (void)archive{
   
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentFilePath = paths.firstObject;
NSString *filePath = [documentFilePath stringByAppendingPathComponent:@"personModel"];
Person *p1 = [[Person alloc]init];
p1.name = @"jack";
p1.age = @"18";
[NSKeyedArchiver archiveRootObject:p1 toFile:filePath];

}
#pragma mark - 一个对象解档
- (void)unarchive{
   
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentFilePath = paths.firstObject;
NSString *filePath = [documentFilePath stringByAppendingPathComponent:@"personModel"];
Person *p1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@",p1.name);
NSLog(@"%@",p1.age);
}

#pragma mark - 多个对象归档
- (void)archiveManyObject
{
   
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值