苹果手机为了保证自己的数据上得绝对安全设计了沙盒,每一个应用程序都配备了自己的沙盒文件,每一次运行,文件夹的名字就会变成一个没有任何规律的字符串.1
沙盒里有多少文件夹?
沙盒里一共有三个文件夹
1.ducuments文件:主要是用来存储用户的想要存储的一些信息,比如收藏的信息或者自己设置的一些内容,所以我们做收藏功能就是往这个文件夹里写文件
2.library文件:这个文件夹是方便程序开发者使用的,主要是操作它里的两个文件,caches和preferences;
caches:用来保存缓存文件,SDWebImage会把图片加到缓存文件中,所以清除缓存功能就是把这个文件夹删除(存在caches文件就是缓存的文件)
preferences一般来保存程序设置的信息,比如NSUserDefautls就会把数据保存在这个文件夹里
3.tmp文件:一般存放临时内容
4.之前iOS8之前沙盒里还有一个.app文件,在新的版本里已经被移走了
数据持久化步骤
1.指定前往哪一个文件夹
2.用字符串接受路径
3.拼接文件路径
4.写入本地或者归档操作
注:如果是复杂对象归档,要签订nscoding方法,并且实现两个协议的方法,放在数组里的复杂对象归档也要签协议
找沙盒路径
NSArray *sandBoxPath = NSSearchPathForDirectoriesInzDomains(NSCachesDirectory, NSUserDomainMask, YES);
第一个参数:指定当前前往哪个文件夹,前往document文件用NSDocumentDirectory(64行那个),还可以前往caches文件夹(68行那个)
第二个参数:访问的文件夹类型,指定访问是用户文件夹
第三个参数:绝对路径(YES),相对路径(NO)
绝对路径是个系统来使用的,系统可以根据当前的路径找到文件夹,我们操作文件的时候都是绝对路径
相对路径只会把要前往的文件夹显示,其他部分都是~,告诉程序员要去哪个文件夹
简单对象写入本地(简单对象:NSString,NSArray等)
1.先通过数组获取沙盒路径
NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
2.从数组中获取沙盒路径
NSString *sandBoxPath = sandBox[0];
3.要给写入的文件拼接一个路径,拼接方式有两种
第一种:NSString *documentPath = [sandBoxPath stringByAppendingString:@"/珊珊.txt"];
第二种: NSString *documentPath = [sandBoxPath stringByAppendingPathComponent:@"珊珊.txt"];
我们经常用的是第二种,它是和我们的数据管理的配套的 两者的区别在于第一个要加"/",而第二个不用
4.将字符串写入本地
定义一个字符串:NSString *str = @"哗啦哗啦很丰富,经发局;开发开发";
写入本地代码:
[str writeToFile:documentPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
第一个参数:文件夹要保存的路径
第二个参数:对文件里的代码进行保护YES
第三个参数:编码
第四个参数:错误信息
5.读出沙盒内容
NSString *tempStr = [NSString stringWithContentsOfFile:documentPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",tempStr);
特别注意:如果路径下有对应的文件,则会把原来的文件覆盖,如果没有则创建一个新文件
将数组写入本地
1.创建一个数组
NSArray *arr = @[@"1",@"2",@"3"];
2.通过数组获取沙盒的地址
NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
3.找到沙盒地址
NSString *sandBoxStr=sandBox[0];
4.拼接写入地址
NSString *documentPath = [sandBoxStr stringByAppendingPathComponent:@"故意.txt"];
5.将数组写入到本地
[arr writeToFile:documentPath atomically:YES];
6.将数组读出来
NSArray *readArr = [NSArray arrayWithContentsOfFile:documentPath];
NSLog(@"%@",readArr);
字典写入本地
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"liu",@"2",@"流星雨" ,nil];
NSArray *dicPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [dicPath stringByAppendingPathComponent:@"haaf.plist"];
[dic writeToFile:path atomically:YES];
NSLog(@"%@",path);
NSDictionary *temp = [NSDictionary dictionaryWithContentsOfFile:path];
NSLog(@"%@",temp);
复杂对象写入本地(主要是我们自己创建的对象写入到本地,也叫归档和反归档)
准备工作:我们建立一个Student类继承NSObject,在这个类里定义四个属性,设置了初始化和便利构造器.但是下面我们要说一下在这个类里我们要在.h签订NSCoding,在.m中实现两个协议方法.方法如下:
注意:签订完NSCoding协议之后需要实现两个协议方法,一个是归档的时候使用的,另一个是反归档的时候使用
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeObject:_sex forKey:@"sex"];
[aCoder encodeObject:_hobby forKey:@"hobby"];
[aCoder encodeInteger:_age forKey:@"age"];
//使用encode方法要和数据类型相互匹配
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
self.hobby = [aDecoder decodeObjectForKey:@"hobby"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
对象归档和反归档
1.便利构造器形式创建对象
Student *stu = [Student studentWithName:@"珊珊" sex:@"男" hobby:@"开发费" age:0];
2.通过数组获取沙盒路径
NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
3.用字符串接受沙盒路径
NSString *sandPath=sandBox[0];
4.拼接文件路径
NSString *documentPath = [sandPath stringByAppendingPathComponent:@"刘山.avc"];
5.归档
[NSKeyedArchiver archiveRootObject:stu toFile:documentPath];
6.反归档
Student *newStu = [NSKeyedUnarchiver unarchiveObjectWithFile:documentPath];
数组归档和反归档
NSArray *arr = [NSArray arrayWithObjects:stu1,stu2,stu3, nil];
NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *sandPath = sandBox[0];
NSString *documentPath = [sandPath stringByAppendingPathComponent:@"学生数组.avi"];
[NSKeyedArchiver archiveRootObject:arr toFile:documentPath];
NSLog(@"%@",documentPath);
//反归档
NSArray *arr2 = [NSKeyedUnarchiver unarchiveObjectWithFile:documentPath];
for (Student *stue in arr2)
{
NSLog(@"%@",stue.name);
}
NSUserDefaults
说明:这是个字典,创建方式叫单例.保存在偏好设置文件夹里的plist文件中.
用途:保存简单的字符串.用法和字典相似.存放一些小的数据
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
defaults setObject:@"123456" forKey:@"passWord"];
NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"%@",sandBox[0]);
取值操作(只能这样取值)
NSLog(@"%@",[defaults objectForKey:@"passWord"]);
文件管理者(添加删除文件)
//通过文件管理者对文件夹进行操作
NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES);
NSString *sandBoxpath = sandBox[0];
//创建一个文件管理者
NSFileManager *manager = [NSFileManager defaultManager];
//给要创建的文件夹拼接一个路径
NSString *filePath = [sandBoxpath stringByAppendingPathComponent:@"guyu"];
//文件夹的名不需要有任何的扩展名
//通过manager进行文件夹的创建
//第一个参数:文件路径
[manager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
NSLog(@"%@",filePath);
//向新创建的文件夹里写入一个字符串
NSString *documentPath = [filePath stringByAppendingPathComponent:@"字符串.txt"];
NSString *str = @"我是一个字符串";
[str writeToFile:documentPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
//删除"顾宇"文件夹
[manager removeItemAtPath:filePath error:nil];
NSLog(@"%@",sandBoxpath);
NSArray *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, 1, YES);
NSString *strCaches = cachesPath[0];
[manager removeItemAtPath:strCaches error:nil];