在iOS开发中,经常需要将数据存储到本地,实现的策略有很多,本篇文章简单介绍一下文件存储方式。


存储位置

我们可以将各种各样的数据存储到本地,在iOS应用中,这些文件应当存储在沙盒中

如果是需要持久化的数据应当存储在沙盒的Documents目录当中,如:

NSString*docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];NSString*path=[docPathstringByAppendingPathComponent:@"file.txt"];


存储的数据格式

二进制数据:使用NSFileHandle类,如:

NSFileHandle*fh=[NSFileHandlefileHandleForWritingAtPath:path];[fhwriteData:data];

其中data是一个NSData对象,可以是任何数据


plist格式:与OC中的字典、数组、数值对象对应的非常好

这几种对象都可以有直接进行文件操作的方法,如:arrayWithContentOfFile: writeToFile:


JSON/XML格式:

网络开发中,网络上的数据特别是移动端进行网络通信中的数据大部分采用JSON/XML格式

从网络获取这些格式的数据封装在NSData对象中,可以直接调用NSData下面的方法进行文件存储:

+(instancetype)dataWithContentsOfFile:(NSString*)path-(BOOL)writeToFile:(NSString*)pathatomically:(BOOL)atomically


归档存储

另一个特殊的存储方式是将模型对象直接进行归档存储

要求:模型对象遵循NSCoding协议,并实现协议中的两个协议方法

如:

//AMPerson.h@interfaceAMPerson:NSObject<NSCoding>@property(nonatomic)NSString*name;@property(nonatomic)NSNumber*age;@end

//AMPerson.m-(void)encodeWithCoder:(NSCoder*)aCoder{//NSCoder是编码器对象[aCoderencodeObject:self.nameforKey:@"aaa"];[aCoderencodeObject:self.ageforKey:@"bbb"];}-(instancetype)initWithCoder:(NSCoder*)aDecoder{if(self=[superinit]){self.name=[aDecoderdecodeObjectForKey:@"aaa"];self.age=[aDecoderdecodeObjectForKey:@"bbb"];}returnself;}

//归档存储AMPerson*p1=[[AMPersonalloc]init];p1.name=@"aaa";p1.age=@10;AMStudent*p2=[[AMStudentalloc]init];p2.name=@"bbb";p2.age=@20;p2.score=@99;AMPerson*p3=[[AMPersonalloc]init];p3.name=@"ccc";p3.age=@30;NSArray*arr=@[p1,p2,p3];[NSKeyedArchiverarchiveRootObject:arrtoFile:path];

//解档读取NSArray*arr=[NSKeyedUnarchiverunarchiveObjectWithFile:path];