Fork me on GitHub

UI第十八讲.初级数据持久化 (沙盒, 简单写入对象, 归解档, NSUserDefaults写入读取文件 )

一.什么是沙盒机制

 

沙盒路径文件介绍:

 

 

 

 获取沙盒路径的方法:

 

1     //第一种 获取沙盒路径的方法
2     NSString *pathStr = NSUserName();
3     NSString *homePathStr = NSHomeDirectoryForUser(pathStr);
4     NSLog(@"%@",homePathStr);
5    //第二种 获取沙盒路径的方法
6     NSString *homePathStr1 = NSHomeDirectory();
7     NSLog(@"%@",homePathStr1);

 

获取document文件夹路径的方法

1    //获取document文件夹路径的方法 *********(经常用)
2     NSString *documentStr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
3     NSLog(@"%@",documentStr);

 

 

数据本地化的5种方式:
  1>.NSUserDefaults
    //版本号,是否首次登陆,登陆后的用户名和用户信息
  2>.直接写入本地(可以写入简单对象)
  3>.归解档(主要作用于自定义对象model)
  4>.SQLite -->基于c语言的数据库
  5>.CoreData (主推方式)

//把程序有关的数据和文件存储的地方就是沙盒  一个应用程序只有一个沙盒文件夹
//应用程序是不能跨沙盒读取文件的 (都有一个Bundle ID)

//热更新  在线更新安装

//x86_64  -l -f 错误原因分析:1.路径   2.命名冲突

 

 

二.简单对象写入文件

简单写入文件的四步
     1>.写的东西 数组,字典,data date
     2>.写到哪里
     3>.写进去
     4>.写完拿出来使用

 

NSString类型简单写入文件的方法

 

 1   /*
 2      简单写入文件的四步
 3      1⃣️ 写的东西 数组,字典,data date
 4      2⃣️ 写到哪里
 5      3⃣️ 写进去
 6      4⃣️ 写完拿出来使用
 7      */
 8     //第一种简单对象写入本地的方法
 9     //1⃣️ 写的东西 数组,字典,data date
10     NSString *str = @"张三";
11     //创建写入的文件 后面直接拼接文件  如果没有拼接会自动创建
12     //2⃣️ 写到哪里
13     NSString *documentStr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
14     NSString *path  = [documentStr stringByAppendingString:@"/张三.avi"];
15     // 3⃣️ 写入文件
16     [str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
17     NSLog(@"%@",path);
18     //4⃣️ 写完拿出来使用
19     NSString *str1 = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
20     NSLog(@"%@",str1);

 

 NSData类型简单写入文件的方法:

 

 1    //将网络图片地址转化为URL类型
 2     NSString *str = @"http://img.fs0757.com/news/2015/0901//2015090110400752.jpg";
 3     
 4     NSURL *url = [NSURL URLWithString:str];
 5     //1⃣️ 写的东西 数组,字典,data date
 6     NSData *data = [NSData dataWithContentsOfURL:url];
 7     //2⃣️ 写到哪里
 8     NSString *documentStr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
 9     NSString *path = [documentStr stringByAppendingString:@"/dsa.png"];
10     // 3⃣️ 写入文件
11     [data writeToFile:path atomically:YES];
12     
13     UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100,100 ,100)];
14     //4⃣️ 写完拿出来使用
15     NSData *data1 = [NSData dataWithContentsOfFile:path];
16     //将data类型转化为image类型
17     UIImage *image1 = [UIImage imageWithData:data1];
18     //此步是将转化过来的image 赋给imageView上
19     imageView.image = image1;
20     
21     [self.view addSubview:imageView];
22     
23     NSLog(@"%@",path);
24     

注意:1>.直接写入本地时,第一次写入后,如果再次写入时会覆盖之前的操作
      2>.一次只能写入一条数据
      3>.如果不覆盖,就要先读出来,然后再写进去
      4>. 如果能直接写入本地的 一定要遵循的NSCoding协议

 

 

三.复杂对象写入文件(归解档)

 

 

 复杂文件归解档并写入本地

 

 1     
 2 /*
 3     复杂对象写入文件的步骤
 4     1.有一个遵守NSCoding 协议(实现协议的两个方法) 复杂对象
 5     2.初始化对象
 6     3.需要创建一个NSMutableData
 7     4.创建归档工具  用NSMutableData去初始化归档工具
 8     5.开始归档 通过工具将对象person类的内容编码进persondata 里面
 9     6.结束编码
10     7.把NSMutableData 写入本地
11 */
12     //复杂对象写入本地
13     //进行归解档的对象
14     Person *person = [[Person alloc] init];
15     person.name = @"张三";
16     person.phone = @"12654";
17     
18     //初始化一个NSMutableData
19     NSMutableData *persondata = [NSMutableData data];
20     
21     //创建归档工具
22     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:persondata];
23     //编码过程 将person类的内容编码进来 persondata里面
24     [archiver encodeObject:person forKey:@"Person"];
25     
26     //结束编码
27     [archiver finishEncoding];
28     
29     //初始化一个路径   注意这里不要忘了documentStr的查找路径
30    NSString *documentStr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 30 NSString *path = [documentStr stringByAppendingString:@"/person.txt"]; 31 //把NSMutableData写入本地 32 [persondata writeToFile:path atomically:YES]; 33 34 NSLog(@"%@",path); 35 36 //解档 37 38 //用data接收解档文件的数据和key 39 NSData *data = [NSData dataWithContentsOfFile:path]; 40 41 //创建解档工具 用拿到的data 初始化解档工具 42 NSKeyedUnarchiver *unacher = [[NSKeyedUnarchiver alloc]initForReadingWithData:data]; 43 44 45 //初始化一个类 通过key值接收需要解档的数据 46 Person *person1 = [unacher decodeObjectForKey:@"Person"]; 47 48 //完成解档 49 [unacher finishDecoding]; 50 51 NSLog(@"%@",person1.name);

 

 

Person.h复杂对象类的.h (遵守NSCopying协议)

 

1 #import <Foundation/Foundation.h>
2 
3 @interface Person : NSObject <NSCopying>
4 
5 @property(nonatomic,copy)NSString *name;
6 @property(nonatomic,copy)NSString *phone;
7 
8 @end

 

 

Person.m复杂对象类的.m (实现NSCopying协议的方法)

 1 #import "Person.h"
 2 
 3 @implementation Person
 4 
 5 //转码(序列号)
 6 
 7 -(void)encodeWithCoder:(NSCoder *)aCoder
 8 {
 9     [aCoder encodeObject:self.name forKey:@"pName"];
10     [aCoder encodeObject:self.phone forKey:@"pPhone"];
11 
12 }
13 
14 //反转码(反序列化)  解码
15 -(id)initWithCoder:(NSCoder *)aDecoder
16 {
17     self = [super init];
18     if (self) {
19         self.name = [aDecoder decodeObjectForKey:@"pName"];
20         self.phone = [aDecoder decodeObjectForKey:@"pPhone"];
21   
22     }
23     
24     return self;
25 
26 }

 

归解档的简化方法:

 

 1    //归解档简化版  但是记得遵循协议
 2     Person *person = [[Person alloc] init];
 3     person.name = @"哈哈";
 4     person.phone = @"123456789";
 5      注意这里不要忘了documentStr的查找路径
5     NSString *documentStr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
6 NSString *path = [documentStr stringByAppendingString:@"/person.txt"]; 7 8 //归档 9 [NSKeyedArchiver archiveRootObject:person toFile:path]; 10 11 //解档 12 Person *person1 = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 13 14 NSLog(@"%@",person1.name);

 

 

四.NSUserDefaults写入读取文件

用NSUserDefaults 存取数据

 

 

1    //用NSUserDefaults 存取数据
2     NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
3     
4     //写数据
5     [user setObject:@"哈哈" forKey:@"1"];
6     //读取数据
7     NSString *string  = [user objectForKey:@"1"];
8     NSLog(@"%@",string);

 

 

注意:用的时候  之写入一些简单的数据 例如版本号 是否第一次启动过

 

 

 

 

面试题补充:

一.沙盒浅析:

    iOS应用程序只能在为该程序创建的文件系统中读取文件,不可以去其他地方访问,此区域被称为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等.
   默认情况下,每个沙盒含有3个文件夹:Documents,Library和tmp.

   Documents 苹果建议将程序中建立的或在程序中留蓝到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录.

   Library 存放程序的默认设置或其他状态信息.

   Library/Caches 存放缓存文件,iTunes不会备份此目录,此目录下文件不会再应用退出删除.

   tmp:提供一个即时创建临时文件的地方.
   itunes在与iPhone同步时,备份所有的Documents和Library文件.iPhone在重启时会丢弃所有的tmp文件.

 

 二. 每个iOS应用SDK都被限制在“沙盒”中,“沙盒”相当于一个加了仅主人可见权限的文件夹,苹果对沙盒有以下几条限制。

     (1)、应用程序可以在自己的沙盒里运作,但是不能访问任何其他应用程序的沙盒。

    (2)、应用程序间不能共享数据,沙盒里的文件不能被复制到其他应用程序文件夹中,也不能把其他应用程序文件夹中的文件复制到沙盒里。

    (3)、苹果禁止任何读、写沙盒以外的文件,禁止应用程序将内容写到沙盒以外的文件夹中。

    (4)、沙盒根目录里有三个文件夹:Documents,一般应该把应用程序的数据文件存到这个文件夹里,用于存储用户数据或其他应该定期备份的信息。Library,下有两个文件夹,Caches存储应用程序再次启动所需的信息,Preferences包含应用程序偏好设置文件,不过不要在这里修改偏好设置。temp,存放临时文件,即应用程序再次启动不需要的文件。

三、获取沙盒路径

    (1)、获取沙盒根目录的方法,有以下几种:

            1、用NSHomeDirectory获取

            2、用用户名获取

    (2)、获取Document路径


    (3)、获取tmp路径

    

    (4)、获取cache路径



 

 

 
 
posted @ 2015-10-06 19:36  DengHuiCheng  阅读(195)  评论(0编辑  收藏  举报