UI16_数据持久化(NSUserDefaults,简单对象,复杂对象归档反归档,文件管理者"删除添加文件")

来源:互联网 发布:大数据工程师压力大吗 编辑:程序博客网 时间:2024/05/18 19:45
    苹果手机为了保证自己的数据上得绝对安全设计了沙盒,每一个应用程序都配备了自己的沙盒文件,每一次运行,文件夹的名字就会变成一个没有任何规律的字符串.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];
0 0
原创粉丝点击