数据持久化,就是说将数据写到文件夹中,存入当地沙盒中。所谓沙盒就是一个文件夹,里面是用来存东西的。
沙盒机制:1.当应用程序安装到手机上,手机系统就会为应用分配一个沙盒文件夹
2.每个应用程序只能访问自己的沙盒文件夹,不能访问其他程序的文件夹
3.应用程序可以获取某些权力访问系统的文件夹
4.沙盒的本质就是一个文件夹,名字是随机分配的
模拟器中的沙盒路径:
Finder —> 前往(+ ALT) —> 资源库 —>Application Support —> iPhone Simulator —> 模拟器版本 —> Application —> 沙盒—>一个应用的所有内容
沙盒文件下的四个文件夹:Document:存储用户数据,需要备份的信息,例如itunes同步,iCloud 所以音频 视频不要放到这里
Library/ Caches 缓存文件,音频视频小说等
Library/Pererences(不会直接操作它)
.app(文件夹)(不会直接操作它,一般只会读取,用NSBundle)比如拖入工程中的plilst 照片
tmp 存储临时文件,比如:下载的zip包,解压后放入caches再删除
讲完了沙盒,现在该讲下数据持久化了
简单的数据读写,实现数据持久化
/*
简单对象: NSString NSArray NSDictionary NSData
数据持久化: 把数据写入到文件,存储到沙盒文件夹中
文件读写
写入: 建文件 [对象 写入] writeToFile
读出: 初始化方法读取文件内容 initWithContentsOfFile
注意:数组和字典中存储的对象类型,必须是上述四种对象!!!!
NSData 用于存储二进制数据 例如 图片--> NSData -->写入
*/
1.使用NSUserDefaults操作的是一个plist文件
2.plist文件不需要开发人员创建,不需要指定路径,默认路径在Preferences文件夹下
NSUserDefaults * userDefaults = [NSUserDefaultsstandardUserDefaults];
[userDefaults setObject:@"黄蓉" forKey:@"name"];
[userDefaults setInteger:22 forKey:@"age"];
//立即(同步)存储,否则存储时有延时
[userDefaults synchronize];
归档(序列化) 也是用来实现数据持久化,不是数据持久化,而是两个先后步骤
复杂对象(基本数据类型 对象必须遵循NSCoding协议,对象类型中的属性也必须遵守)—>NSData
person —>归档—>NSData —>writeToFile—>document
person <—返归档<—NSData <— initWithContentsOfFile <—document
1.归档: 序列化,编码,类似压缩文件.
2.归档: 把符合条件的对象转换为NSData对象
3.能进行归档的对象,必须遵守NSCoding协议. 对象的属性,如果是对象,也必须遵守NSCoding协议
NSBundle中的文件只可读 不可写
NSFileManager 文件管理器,单例获取对象, 操作文件,创建,复制,剪切,删除; 创建子文件夹; 判断文件是否存在,返回值为BOOL
归档
//使用工具,实现对person对象进行归档
//NSMutableData是容器,先是空的,归档结束,用来放person
NSMutableData * archiveData = [NSMutableDatadata];
//归档工具,继承自NSCoder
NSKeyedArchiver * archiver = [[NSKeyedArchiveralloc] initForWritingWithMutableData:archiveData];
//对person对象进行归档操作
[archiver encodeObject:p forKey:@"person"];
//结束归档操作
[archiver finishEncoding];
NSLog(@"archiveData = %@",archiveData);
//数据持久化将归档得到的data存入沙盒
NSString * documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString * filePath = [documentPath stringByAppendingPathComponent:@"singlePerson"];
NSLog(@"filePath = %@",filePath);
[archiveData writeToFile:filePath atomically:YES];
[p release];
[archiver release];
反归档
NSString * documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString * filePath = [documentPath stringByAppendingPathComponent:@"singlePerson"];
//从沙盒文件中读出data
NSData * readData = [NSDatadataWithContentsOfFile:filePath];
//使用工具,将data反归档为person对象
NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:readData];
//解码
Person * p = [unarchiver decodeObjectForKey:@"person"];
[unarchiver finishDecoding];
NSLog(@"name = %@ age = %ld",p.name,p.age);
[unarchiver release];