什么是数据持久化?数据的永久存储
为什么要坐数据持久化:存储在内存中的数据,程序关闭,内存释放,数据丢失,这种数据是临时的
数据初九化的本质:数据保存成文件,存储到程序的沙河中
1.沙盒机制
每个应用程序位于文件系统的严格限制部分
每个应用程序只能在为该程序创建的文件系统中读取文件
每个应用程序在IOS系统内都放在了统一的文件夹目录下
沙盒的本质就是一个文件夹,名字是随机分配的.
2.沙盒路径的位置
1.通过Finder查找程序沙盒相对的路径
通过代码查找程序沙盒相对路径
NSString *DocumentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSLog(@"%@",DocumentPath);
2.沙盒构成
Document 存储用户数据,需要备份的信息
Library/Caches 存储缓存文件,程序专用的支持文件
Library/Preferences 存储应用程序的偏好设置文件
.app 程序包(IOS8时,app不存储在沙盒中,有单独的文件夹存储所有程序的app包)
tmp 存储临时文件,比如:下载的zip包,解压后的再删除
3.获取沙盒目录路径的方法
NSHomeDirectory-------------------->沙盒主路径
NSDocumentDirectory--------------->Document文件夹
NSLibraryDirectory------------------->Library文件夹
NSCachesDirectory------------------>Caches文件夹
NSTemporaryDirectory--------------->tem文件夹
代码
- <span style="font-family:SimHei;font-size:18px;">//1.home主目录里面有:Documents,Library,tmp和一个应用程序
- NSLog(@"Home:%@",NSHomeDirectory());
- //2.DocumentsPath路径
- NSString *DocumentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
- NSLog(@"DocumentsPath:%@",DocumentsPath);
- //3.Libray
- NSString *librayPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0];
- NSLog(@"%@",librayPath);
- //4.temp
- NSLog(@"temp:%@",NSTemporaryDirectory());
- //5.cachesPath
- NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
- NSLog(@"cachesPath:%@",cachesPath);
- //6.user
- NSString *user = NSUserName();
- NSLog(@"user:%@",user);</span>
------------------------------------------------>>>>简单文件写入
- <span style="font-family:SimHei;font-size:18px;">//nsstring写入
- //1.写入的路径
- NSString *DocumentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
- NSLog(@"%@",DocumentPath);
- //2.拼接文件路径
- NSString *filePath = [DocumentPath stringByAppendingString:@"/myText.txt"];
- //3.准备写入的内容
- NSString *content = @"Hello World";
- [content writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
- //4.读取
- NSString *readString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
- NSLog(@"redstring : %@",readString);
- //NSArray
- //1.获取documents路径
- //2.拼接文件路径
- NSString *arrayFile = [DocumentPath stringByAppendingString:@"/array.plist"];
- NSLog(@"arrayPath = %@",arrayFile);
- //3.准备内容
- NSArray * contentArray = @[@"1",@"2",@"3",@"4",@"5",];
- //4.写入
- [contentArray writeToFile:arrayFile atomically:YES];
- //5.读取
- NSArray *readArray = [NSArray arrayWithContentsOfFile:arrayFile];
- NSLog(@"readArray : %@",readArray);
- //dictinary
- //1.拼接
- NSString *dictFile = [DocumentPath stringByAppendingString:@"/dict.plist"];
- //2.准备内容
- NSDictionary *dictcontent = @{@"1":@"a",@"2":@"b",@"3":@"c"};
- NSLog(@"%@",dictFile);
- //3.写入
- [dictcontent writeToFile:dictFile atomically:YES];
- //4.读取字典
- NSDictionary *readDict = [NSDictionary dictionaryWithContentsOfFile:dictFile];
- NSLog(@"dict : %@",readDict);</span>
NSFileManager,文件管理,使用detaultManager,创建单利对象
可以创建文件夹
可以创建,移动,复制,删除文件,
可以判断文件是否存在
- <span style="font-family:SimHei;font-size:18px;"> //NSFileManager
- //创建文件夹
- //在Documents中创建一个文件夹
- NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
- //在Documents中创建一个文件夹命名为"个人收藏"
- NSString *path = [documentsPath stringByAppendingString:@"/个人收藏"];
- //创建文件管理(单利),并创建文件夹
- [[NSFileManager defaultManager]createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
- NSLog(@"DocumentsPath%@",documentsPath);
- //修改文件夹
- NSString *newPath = [documentsPath stringByAppendingString:@"/岛国文化"];
- [[NSFileManager defaultManager]moveItemAtPath:path toPath:newPath error:nil];
- //删除
- [[NSFileManager defaultManager]removeItemAtPath:documentsPath error:nil];
- //判断某个文件是否存在
- //返回值是BOOL,YES存在,NO不存在
- [[NSFileManager defaultManager]fileExistsAtPath:newPath];</span>
--------------------------------------------------->>>>复杂对象写入文件(归档/反归档)
1.什么是复杂对象
1.在foundation框架内不存在的数据类
2.无法在程序内通过writeToFile类型的方法写入到文件内
3.复杂对象至少包含一个实例对象
复杂对象无法通过writeToFile:方法进行数据持久化,只能通过将复杂对象转换为NSData,通过writeToFile进行数据持久化
将复杂的对象转化为NSData,通过归档;将NSData转换为复杂对象,通过反归档
复杂对象写入文件要遵循NSCoding协议
有两个方法,代码如下:
- <span style="font-family:SimHei;font-size:18px;">//进行归档时调用(系统调用)
- -(void)encodeWithCoder:(NSCoder *)aCoder
- {
- //对属性进行编码
- [aCoder encodeObject:self.name forKey:kName];
- [aCoder encodeObject:self.age forKey:kAge];
- }
- //进行反归档编码时
- -(id)initWithCoder:(NSCoder *)aDecoder
- {
- self = [super init];
- //反编码
- if (self)
- {
- self.name = [aDecoder decodeObjectForKey:kName];
- }
- return self;
- }</span>
归档/反归档代码如下:
- <span style="font-family:SimHei;font-size:18px;">//归档 反归档
- //创建 Person类实例对象
- Person *person1 = [[Person alloc] init];
- person1.name = @"刘杰";
- person1.age = @"39";
- Person *person2 = [[Person alloc] init];
- person2.name = @"李士杰";
- person2.age = @"18";
- //归档使用的NSData
- NSMutableData *Person1Data = [NSMutableData data];
- //创建归档工具
- NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:Person1Data];
- //进行归档
- [archiver encodeObject:person1 forKey:kPerson1];
- [archiver encodeObject:person2 forKey:kPerson2];
- //完成转换
- [archiver finishEncoding];
- //找到路径
- NSString *docunment = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
- //拼接文件路径
- NSString *personPath = [docunment stringByAppendingString:@"/刘杰.xxoo"];
- //写入文档
- [Person1Data writeToFile:personPath atomically:YES];
- NSLog(@"%@",docunment);
- //反归档
- //通过文件路径,获取data数据
- NSData * unData = [NSData dataWithContentsOfFile:personPath];
- //反归档工具
- NSKeyedUnarchiver *unAechiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unData];
- //反归档
- Person *p1 = [unAechiver decodeObjectForKey:kPerson1];
- Person *p2 = [unAechiver decodeObjectForKey:kPerson2];
- //结束反归档
- [unAechiver finishDecoding];
- NSLog(@"name:%@",p1.name);
- NSLog(@"name :%@",p2.name);
- </span>
单个归档.反归档
- <span style="font-family:SimHei;font-size:18px;"> //获取Documents路径
- NSString *DocumentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
- //拼接文件路径
- NSString *filePath = [DocumentsPath stringByAppendingString:@"/PersonArray.plist"];
- //实例一个对象
- Person *p1 = [[Person alloc] init];
- p1.name = @"别闹了";
- p1.age = @"1";
- //归档
- [NSKeyedArchiver archiveRootObject:p1 toFile:filePath];
- //反归档
- Person *p2 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
- NSLog(@"name: %@",p2.name);</span>
多个归档/反归档
- <span style="font-family:SimHei;font-size:18px;"> //获取Documents路径
- NSString *DocumentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
- //拼接文件路径
- NSString *filePath = [DocumentsPath stringByAppendingString:@"/PersonArray.plist"];
- //实例一个对象
- Person *pn1 = [[Person alloc] init];
- pn1.name = @"TOM";
- pn1.age = @"12";
- Person *pn2 = [[Person alloc] init];
- pn2.name = @"KIM";
- pn2.age = @"18";
- NSArray *array = @[pn1,pn2];
- //归档
- [NSKeyedArchiver archiveRootObject:array toFile:filePath];
- //反归档
- NSArray *a = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
- NSLog(@"%@,%@",[a[0] name],[a[1] name]);</span>
沙盒机制:
简单对象写入文件,只能是NSString,NSArray,NSDictionary,NSData
复杂的对象写入文件,遵守NSCoding协议,实现代理方法