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

    苹果手机为了保证自己的数据上得绝对安全设计了沙盒,每一个应用程序都配备了自己的沙盒文件,每一次运行,文件夹的名字就会变成一个没有任何规律的字符串.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值