数据持久化

  • 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中读取出数据

     

你可能感兴趣的:(持久化)