在iOS开发中常常需要将本地数据存储起来 通常有如下几种方式
- plist存储
- 偏好设置存储
- 归档存储
- SQLite存储
- core data存储
今天简单介绍一下前面三种存储方式- plist存储 --plist存储的本质就是生成一个plist文件 是用来存储数组和字典,但是需要注意的是
自定义对象不能
用plist来进行存储
plist是什么类型存储的 读取也必须是同样的类型
- plist存储的存储数据(比如想要存储一个数组)
- plist存储 --plist存储的本质就是生成一个plist文件 是用来存储数组和字典,但是需要注意的是
NSArray *array = @[@"jack",@26];
//获取caches文件夹路径
//NSSearchPathDirectory directory -->搜索文件夹
//NSSearchPathDomainMask domainMask -->在哪个范围内查找
//BOOL expandTilde -->是否展开
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
//拼接文件名
NSString *filePath = [cachesPath stringByAppendingPathComponent:@"array.plist"];
//存储数据
[array writeToFile:filePath atomically:YES];
- plist存储的数据读取(比如想要读取一个数组)
//获取caches文件夹路径
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
//拼接文件名
NSString *filePath = [cachesPath stringByAppendingPathComponent:@"array.plist"];
//读取文件
NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
- 偏好设置存储 --偏好设置存储是以字典的形式进行偏好设置,用法跟字典一样 偏好设置存储主要用到一个关键类
NSUserDefaults
偏好设置存储的好处:不需要关心文件名 可以快速进行键值对存储 可以存储基本数据类型
- 偏好设置存储
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"jack" forKey:@"name"];
[defaults setInteger:26 forKey:@"age"];
- 偏好设置读取
NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];
NSInteger age = [[NSUserDefaults standardUserDefaults] integerForKey:@"age"];
- 归档存储 --任何对象都可以进行归档存储
自定义对象也可以
NSKeyedArchiver
专门用来做自定义对象归档- 归档存储(比如想要存储一个自定义对象
car
)
- 归档存储(比如想要存储一个自定义对象
ZDCar *car = [[ZDCar alloc] init];
car.brand = @"BMW";
car.color = @"black";
//获取caches文件夹
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
//拼接文件名
NSString *filePath = [cachesPath stringByAppendingPathComponent:@"car.xxoo"];
//存储数据
[NSKeyedArchiver archiveRootObject:car toFile:filePath];
- 归档存储的读取
//获取caches文件夹
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
//拼接文件名
NSString *filePath = [cachesPath stringByAppendingPathComponent:@"car.xxoo"];
//读取数据
ZDCar *car = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
注意:在调用
[NSKeyedArchiver archiveRootObject:car toFile:filePath];和[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
这两个方法时
底层会调用
- (void)encodeWithCoder:(NSCoder *)aCoder
和- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder
这两个方法 所以需要在自定义的类中遵守<NSCoding>
这个协议并实现上述两个方法
还有一点需要注意 在实现- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder
这个方法时当父类遵守了<NSCoding>
这个协议就需要调用[super initWithCoder:aDecoder]
反之则调用[super init]