iOS开发中经常用到本地持久化的技术,本地持久化的方法也很多,常用方法有如下几种:
1.NSUserdaults (用户默认)
2.write to file (写文件)
3.NSkeyArchiver (归档解档)
4.SQLite (数据库)
5.core data (封装了SQLite)
因为本随笔主要是针对快速储存,所以相对繁琐的数据库类型就不做介绍了,如果想了解SQLite,亲关注鄙人的相关随笔.
1.NSUserdaults (用户默认)
这个方法是所有方法里最为简单的,因为通常你只需要一行代码存储,一行代码提取数据.但是对存储的数据类型有所限制,支持:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary. Mutable类型也可以.
你看名字就能知道这个方法推荐让你存储一些用户的默认设置,比如:账户,密码,声音开关,震动开关等.但是不代表你不可以存储别的数据.
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 //定义字符串张三 4 NSString * str = @"张三"; 5 //存储张三 6 [[NSUserDefaults standardUserDefaults] setObject:str forKey:@"zhangsan"]; 7 //创建对象李四 8 Lisi * lisi = [[Lisi alloc]init]; 9 //给李四名字赋值 10 lisi.name = @"李四"; 11 //这里使用了李明杰老师的第三方框架,因为 NSUserDefaults 存储类型有限制,不能存储模型 12 NSMutableDictionary * dict = [lisi mj_keyValues]; 13 //存储李四 14 [[NSUserDefaults standardUserDefaults] setObject:dict forKey:@"lisi"]; 15 } 16 17 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 18 //读取数据 19 id person1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"zhangsan"]; 20 id person2 = [[NSUserDefaults standardUserDefaults] objectForKey:@"lisi"]; 21 //其实我们知道person1 是个字符串 , person2是个字典 22 NSLog(@"person1=%@ person2=%@",((NSString *)person1),[((NSMutableDictionary *)person2) objectForKey:@"name"]); 23 }
2.write to file (写文件)
这个方法的特点是数据写成一个文件,如果存得是字符串,可用文本编辑器打开,如果存得是其他类型,那么存得是一个xml文件.支持:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary. Mutable类型也可以.
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 /** 4 这里需要注意一下.持久化储存路径分为Documents,Library,Temp三个文件夹 5 Documents文件夹会备份 6 Library文件夹中的Preferences文件夹也会被备份.Caches文件夹不会被备份 7 Tmp是临时文件,一般不往这个文件夹做持久化,这个文件夹会被系统自动清理 8 */ 9 //我这里选择不会备份的Caches文件夹作为存储地址 10 NSString * caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject; 11 zhangsanFilePath = [caches stringByAppendingPathComponent:@"zhangsan"]; 12 //输出文件夹路径 13 NSLog(@"caches=%@",caches); 14 15 NSString * str = @"张三"; 16 NSError * error; 17 [str writeToFile:zhangsanFilePath atomically:YES encoding:NSUTF8StringEncoding error:&error]; 18 if (error) NSLog(@"error = %@",error); 19 20 //创建对象李四 21 Lisi * lisi = [[Lisi alloc]init]; 22 //给李四名字赋值 23 lisi.name = @"李四"; 24 //这里使用了李明杰老师的第三方框架,因为模型是没有writeToFile方法. 25 NSMutableDictionary * dict = [lisi mj_keyValues]; 26 lisifilePath = [caches stringByAppendingPathComponent:@"lisi"]; 27 [dict writeToFile:lisifilePath atomically:YES]; 28 } 29 30 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 31 //读数据 32 //因为你知道存储类型,所以读数据用类方法 33 NSString * zhangsan = [NSString stringWithContentsOfFile:zhangsanFilePath encoding:NSUTF8StringEncoding error:nil]; 34 NSLog(@"zhangsan=%@",zhangsan); 35 36 NSDictionary * lisi = [NSDictionary dictionaryWithContentsOfFile:lisifilePath]; 37 NSLog(@"lisi=%@",[lisi objectForKey:@"name"]); 38 }
3.NSkeyArchiver (归档解档)
这种方法的特点是能够存储模型(前面两种储存模型时都需要转成字典),需要模型遵守NSCoding协议,还要重写encodeWithCoder和initWithCoder方法.
1 //归档 2 - (void)encodeWithCoder:(NSCoder *)aCoder { 3 [aCoder encodeObject:_name forKey:@"NAME"]; 4 } 5 //解档 6 - (instancetype)initWithCoder:(NSCoder *)aDecoder { 7 self = [super init]; 8 if (self) { 9 _name = [aDecoder decodeObjectForKey:@"NAME"]; 10 } 11 return self; 12 }
到这里准备工作做完了,然后进行存储和读取操作.这里也需要传路径
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 4 NSString * caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject; 5 NSLog(@"caches=%@",caches); 6 lisifilePath = [caches stringByAppendingPathComponent:@"lisi"]; 7 8 Lisi * lisi = [[Lisi alloc]init]; 9 lisi.name = @"李四"; 10 //归档 11 BOOL isSuccess = [NSKeyedArchiver archiveRootObject:lisi toFile:lisifilePath]; 12 if (isSuccess) NSLog(@"success"); 13 14 } 15 16 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 17 //解档 18 Lisi * lisi = [NSKeyedUnarchiver unarchiveObjectWithFile:lisifilePath]; 19 NSLog(@"lisi=%@",lisi.name); 20 }
总结:这三种持久化方法都各有特色,NSUserDaults适合配置文件,WriteToFile适合存储大数据,归档适合存储模型.