数据持久化,就是说将数据写到文件夹中,存入当地沙盒中。所谓沙盒就是一个文件夹,里面是用来存东西的。

      沙盒机制:1.当应用程序安装到手机上,手机系统就会为应用分配一个沙盒文件夹

                    2.每个应用程序只能访问自己的沙盒文件夹,不能访问其他程序的文件夹

                    3.应用程序可以获取某些权力访问系统的文件夹

                    4.沙盒的本质就是一个文件夹,名字是随机分配的

 

模拟器中的沙盒路径:

Finder —> 前往(+ ALT) —> 资源库 —>Application Support —> iPhone Simulator —> 模拟器版本 —> Application —> 沙盒—>一个应用的所有内容

   

      沙盒文件下的四个文件夹:Document:存储用户数据,需要备份的信息,例如itunes同步,iCloud  所以音频 视频不要放到这里

                                        Library/ Caches    缓存文件,音频视频小说等

                                        Library/Pererences(不会直接操作它)

                                        .app(文件夹)(不会直接操作它,一般只会读取,用NSBundle)比如拖入工程中的plilst 照片

                                        tmp  存储临时文件,比如:下载的zip包,解压后放入caches再删除

 

 

 讲完了沙盒,现在该讲下数据持久化了

简单的数据读写,实现数据持久化

/*

     简单对象: NSString  NSArray  NSDictionary  NSData

     数据持久化: 把数据写入到文件,存储到沙盒文件夹中

 

     文件读写

     写入: 建文件 [对象 写入]   writeToFile

     读出: 初始化方法读取文件内容  initWithContentsOfFile

 

     注意:数组和字典中存储的对象类型,必须是上述四种对象!!!!

 

     NSData 用于存储二进制数据  例如 图片--> NSData -->写入

     */

 

 

1.使用NSUserDefaults操作的是一个plist文件

     2.plist文件不需要开发人员创建,不需要指定路径,默认路径在Preferences文件夹下

NSUserDefaults * userDefaults = [NSUserDefaultsstandardUserDefaults];
    [userDefaults setObject:@"黄蓉" forKey:@"name"];
    [userDefaults setInteger:22 forKey:@"age"];
    
    
    //立即(同步)存储,否则存储时有延时
    [userDefaults synchronize];

 

 

归档(序列化) 也是用来实现数据持久化,不是数据持久化,而是两个先后步骤

复杂对象(基本数据类型  对象必须遵循NSCoding协议,对象类型中的属性也必须遵守)—>NSData

person —>归档—>NSData —>writeToFile—>document
person <—返归档<—NSData <— initWithContentsOfFile <—document
 
1.归档: 序列化,编码,类似压缩文件.
2.归档: 把符合条件的对象转换为NSData对象
3.能进行归档的对象,必须遵守NSCoding协议. 对象的属性,如果是对象,也必须遵守NSCoding协议
 
 
 
 
NSBundle中的文件只可读 不可写
 
NSFileManager  文件管理器,单例获取对象, 操作文件,创建,复制,剪切,删除; 创建子文件夹; 判断文件是否存在,返回值为BOOL
 
 
归档
 //使用工具,实现对person对象进行归档
    
        //NSMutableData是容器,先是空的,归档结束,用来放person
NSMutableData * archiveData = [NSMutableDatadata];
    
        //归档工具,继承自NSCoder
    NSKeyedArchiver * archiver = [[NSKeyedArchiveralloc] initForWritingWithMutableData:archiveData];
    
        //对person对象进行归档操作
    [archiver encodeObject:p forKey:@"person"];
    
  //结束归档操作
    [archiver finishEncoding];
    NSLog(@"archiveData = %@",archiveData);
    
    
    //数据持久化将归档得到的data存入沙盒
    NSString * documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString * filePath = [documentPath stringByAppendingPathComponent:@"singlePerson"];
    NSLog(@"filePath = %@",filePath);
    
    [archiveData writeToFile:filePath atomically:YES];
    
    [p release];
    [archiver release];
 
反归档
NSString * documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString * filePath = [documentPath stringByAppendingPathComponent:@"singlePerson"];
    //从沙盒文件中读出data
    NSData * readData = [NSDatadataWithContentsOfFile:filePath];
    
    //使用工具,将data反归档为person对象
    NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:readData];
    
 //解码
    Person * p = [unarchiver decodeObjectForKey:@"person"];
    
    [unarchiver finishDecoding];
    
    NSLog(@"name = %@ age = %ld",p.name,p.age);
    
    [unarchiver release];