- 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 = [sandboxPathstringByAppendingPathComponent:@"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中读取出数据