一、 User Defaults
1. 是什么?
是一个特殊的plist文件
2. 干什么?
用于保存应用的配置信息
3. 存什么信息?
信息:欢迎界面有没有被打开过
目的:欢迎界面只显示一次
信息:应用程序被打开的次数/使用的时间长度/交互的次数
目的:当应用程序被打开10次后 请求用户对程序打星
信息:数据版本信息
目的:数据迁移
1.0
1|TXT|数据迁移
2.0
2212|26782162|TXT|数据迁移|3278232234562734
信息:默认信息
目的:打开应用程序后 显示默认帐号名
- (void)viewDidLoad { [super viewDidLoad]; // 判断用户是否是第一次打开 // 获取用户默认standardUserDefaults NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; BOOL opened = [userDefault boolForKey:@"opened"]; // 获取key值opened [userDefault setBool:YES forKey:@"opened"]; // 设置key值opened [userDefault synchronize]; // 同步 }
使用User Defaults
当程序被打开10次时,弹出UIAlertView
提示用户打星
如果选择先不打那么在运行10次后在提醒直到选择好的则不在提醒
-(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; // 取出配置文件中的数据 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSInteger runCount = [userDefaults integerForKey:@"runCount"]; NSInteger nextAlertCount = [userDefaults integerForKey:@"nextAlertCount"]; NSLog(@"runCount:%d",runCount); NSLog(@"nextAlertCount:%d",nextAlertCount); // 判断运行次数 if (runCount == 0) { nextAlertCount = 10; [userDefaults setInteger:nextAlertCount forKey:@"nextAlertCount"]; } if (runCount == nextAlertCount) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"好用就打个分吧" delegate:self cancelButtonTitle:@"先不打" otherButtonTitles:@"好的", nil]; [alert show]; } // runCount+1 保存数据 [userDefaults setInteger:++runCount forKey:@"runCount"]; [userDefaults synchronize]; } -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ if (buttonIndex == 0) { // 先不打 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSInteger nextAlertCount = [userDefaults integerForKey:@"nextAlertCount"]; NSInteger runCount = [userDefaults integerForKey:@"runCount"]; nextAlertCount = runCount + 10; [userDefaults setInteger:nextAlertCount-1 forKey:@"nextAlertCount"]; [userDefaults synchronize]; } }
二、archive归档
plist是对象和plist之间的转换
archive是对象(任何)到NSData的渠道
对象到NSData(归档)步骤:
归档(拆毛衣)
NSObject 对象 毛衣
NSMutableData 字节 毛线团
NSKeyedArchiver 归档器 拆毛线针
NSCoder 字节片段 毛线段
反归档(织毛衣)
NSData 字节 毛线团
NSKeyedUnarchiver 反归档器 织毛线针
NSObject 对象 毛衣
NSCoder 字节片段 毛线段
注意:对于每一个支持Archive的对象
1) 必须遵循NSCoding协议
2) 必须覆盖
initWithCoder
encodeWithCoder
知识点:[aCoder encodeObject:self.father forKey:@"father"]; // 该属性是对象,程序执行到这里会进入到该对象里进行归档(该对象必须实现归档方法),所以有多个有关联的对象只归档一个就行了
代码如下:
- (void)viewDidLoad { [super viewDidLoad]; MXPerson *person = [[MXPerson alloc] init]; person.name = @"张三"; person.age = 19; // 对象 -> NSData 归档 // 1 创建可变data 构建毛线团 NSMutableData *data = [NSMutableData data]; // 2 创建archive对象 准备拆线器 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; // 3 编码 拆线 [archiver encodeObject:person forKey:@"person"]; // 4 完成 收线 [archiver finishEncoding]; // NSData -> 对象 // 获取到data 构建毛线团 // 创建反归档对象 准备织毛线针 NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; // 织毛衣 MXPerson *p2 = [unarchiver decodeObjectForKey:@"person"]; }
三、存储总结
1. 解决的核心问题
在一台设备上保持数据
内存里的对象 <-> 硬盘上的文件
能够让内存中的对象延长生命周期
2. 渠道
1) 基础文件存储
内存对象 NSData 文件
NSString <-------------------> 文件
从右向左API: <--
+ stringWithContentsOfFile:encoding:error:
+ stringWithContentsOfFile:usedEncoding:error:
从左向右API:->
– writeToFile:atomically:encoding:error:
NSString <---> NSData
<-
– initWithData:encoding:
->
– dataUsingEncoding:
UIImage <--------------------> 文件
<-
+ imageNamed: Bundle内的
+ imageWithContentsOfFile: 任何
UIImage <----> NSData
<-
- initWithData:
NSData <------> 文件
<-
+ dataWithContentsOfFile:
->
- writeToFile:
a) 你是否需要分块读取/写入文件?
需要:请使用NSFileHandle进行文件读取,替代 NSData <----> 文件
情形:文件追加
b) 你是否需要存储自定义对象
是
b.1) 模型层对象少,对象简单,关系不复杂
自行构建
对象 <----> NSString
->
拼凑字符串
<-
拆分字符串
b.2) 对象结构复杂
跳转到 2)
2) Plist文件存储
plist支持对象 <-> plist文件
<-
+ arrayWithContentsOfFile:
+ dictionaryWithContentsOfFile:
->
- writeToFile:atomically:
手工处理
自定义对象 <-> plist支持对象
<->
对象 字典
+ 属性 + key-value
a) 该对象需要跨平台么?
需要:
放弃plist存储,改为自定义XML格式存储
自行构建 对象 <-> xml 的渠道
xml字符串 <-> NSData 。。。继续参考1)
b) 该数据是否是应用程序相关?
是应用程序,而不是业务相关
需要:
放弃plist存储,改为NSUserDefaults存储
c) 对象之间的关系是不是很复杂,对象的属性需要不需要可读
如果关系复杂,不需要可读
请转接 3)
3) Archive 存储
对象 <-> NSData
<-
反归档 decode unarchive
+ initWithCoder
->
归档 encode archive
- encodeWithCoder
NSData <-> 文件之间的渠道 请参见1)
1.2.3.z)
你希望不希望少写解析代码?
你希望不希望更高级的查询消息?
你希望不希望不关心文件的存储位置?
你希望不希望处理更复杂的对象关系?
如果你都希望
请转接 4)
4) SQL数据库 & Core Data
单词
Archive 归档 A. Er1 Kai4 Vu.
Encode 编码 Yin3 Kou4 De.
Decode 解码 Di1 Kou4 De.
Coder 码 Kou1 De.
04-IOSCore - User Defaults、Archive、存储总结,布布扣,bubuko.com
04-IOSCore - User Defaults、Archive、存储总结
原文:http://www.cnblogs.com/yangmx/p/3583103.html