zoukankan      html  css  js  c++  java
  • 数据持久化

    • NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在,而且这个方法是一个单例  整个app只有一个。                                                                                                   NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、 NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储,一般都是用来存储用户名密码,判断是否版本新特性等功能处来使用具体实现如下
    • //这是存储操作 
      NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
      NSString *name =@”default string“; [defaults setObject:firstName forKey:@"name"];
      //获得UIImage实例
      UIImage *image=[[UIImage alloc]initWithContentsOfFile:@"photo.jpg"];
      NSData *imageData = UIImageJPEGRepresentation(image, 100);//UIImage对象转换成NSData
      [defaults synchronize];//用synchronize方法把数据持久化到standardUserDefaults数据库

      感觉这个上面那个例子没啥用  呵呵 这是查阅资料看到的

      //读取数据:
      NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
      NSString *name = [defaults objectForKey:@"name"];//根据键值取出name
      NSData *imageData = [defaults dataForKey:@"image"];
      UIImage *Image = [UIImage imageWithData:imageData];//NSData转换为UIImage

      不过name那个还是蛮有用的  这个 defaults 是个字典  一般取出东西都是要用key的;

    • NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提 供encodeWithCoder:和initWithCoder:方法。前⼀一个方法告诉系统怎么对对象进行编码,而后⼀一个方法则是告诉系统怎 么对对象进行解码。例如对Possession对象归档保存.一般这个都是在模型里实现,用来保存模型对象的。
      @interface Possession:NSObject<NSCoding>{//遵守NSCoding协议
      NSString *name;//待归档类型 
      }
      @implementation Possession -(void)encodeWithCoder:(NSCoder *)aCoder{
             [aCoder encodeObject:name forKey:@"name"];
       }
      -(void)initWithCoder:(NSCoder *)aDecoder{
             name=[aDeCoder decodeObjectforKey:@"name"];
      }

      归档操作: 如果对Possession对象allPossession归档保存,只需要NSCoder子类NSKeyedArchiver的方法 archiveRootObject:toFile: 即可。这里说的allPossession就是模型对象  用Possession创建出来的对象;

      NSString *path = [self possessionArchivePath];
      [NSKeyedArchiver archiveRootObject:allPossessions toFile: path ];

      解压操作: 同样调用NSCoder子类NSKeyedArchiver的方法unarchiveRootObject:toFile: 即可 allPossessions = [NSKeyedUnarchiver unarchiveObjectWithFile:path];缺点:归档的形式来保存数据,只能⼀一次性归档保存以及⼀一次性解压。所以只能针对小量数据,而且对数据操作比较 笨拙,即如果想改动数据的某⼀一小部分,还是需要解压整个数据或者归档整个数据,麻烦的要死;

    • Write写入方式:永久保存在磁盘中。具体方法为:
      第⼀一步:获得文件即将保存的路径:
      NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);//使用C函数NSSearchPathForDirectoriesInDomains来获得沙盒中目录的全路

      径。该函数有三个参数,目录类型、he domain mask、布尔值。其中布尔值表示是否需要通过?~扩展路径。 而且第⼀一个参数是不变的,即为NSSearchPathDirectory 。在IOS中后两个参数也是不变的,即为

      NSUserDomainMask 和 YES。
      NSString *ourDocumentPath =[documentPaths objectAtIndex:0];

      还有⼀一种方法是使用NSHomeDirectory函数获得sandbox的路径。具体的用法为:

      NSString *sandboxPath = NSHomeDirectory();
      // Once you have the full sandbox path, you can create a path from it,但是不能在sandbox的本文件层上写 文件也不能创建目录,而应该是此基础上创建⼀一个新的可写的目录,例如Documents,Library或者temp。 NSString *documentPath = [sandboxPath

      stringByAppendingPathComponent:@"Documents"];//将Documents添加到sandbox路径上,具体原 因前面分析了!

      这两者的区别就是:使用NSSearchPathForDirectoriesInDomains比在NSHomeDirectory后面添加Document更加安全。因为该文件目 录可能在未来发送的系统上发生改变。最好使用第一种方法,再说了两种方法都差不多

      第二步:生成在该路径下的文件:

      NSString *FileName=[documentDirectory stringByAppendingPathComponent:fileName];//fileName就是保存文件的文件 名

      第三步:往文件中写入数据:
      [data writeToFile:FileName atomically:YES];//将NSData类型对象data写入文件,文件名为FileName

      最后在路径中读出文件                                                                                                                          NSData data=[NSData dataWithContentsOfFile:FileName options:0 error:NULL];//从FileName中读取出数据

  • 相关阅读:
    Object.keys
    数组内容深拷贝的应用
    CSS如何让页脚固定在页面底部
    vue eslint开发 关掉 tab错误提示
    input框,需要隐式显示的时候,不让它自动填充的办法
    关于BFC
    File协议与HTTP协议 以及区别
    关于缓存
    深拷贝浅拷贝 遇到了bug
    聚餐学习
  • 原文地址:https://www.cnblogs.com/miaoqiang/p/4507761.html
Copyright © 2011-2022 走看看