沙盒本地数据化

model : 1 .怎么来的  2: 放在哪 3: 怎么用是一个好的方式

数据本地化 : 1: 什么事沙河,沙河都有哪些文件夹,作用是什么.
                      2: 什么事数据本地化,什么时候使用
                     3: 如何把一个数组,字典,字符串,NSData放入本地
                     4: 如何把一个Person对象存入本地

                     NSFileManger  NSFileHandle(了解就行) ;


                                           沙盒机制


——————————————沙盒
沙盒 : 每个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立,封闭,安全的空间 ,叫做沙盒 
注意: 1: 每一个应用程序都会拥有一个应用程序沙盒 
         2: 应用程序沙盒就是一个系统目录 
        独立:  不可能出现两个程序公用同一个沙盒
       封闭 : 每一个沙盒 都只能他自己的应用去使用
      安全 :沙盒   有被删除的失效

手动自动存入东西 

——————————————文件夹
文件夹
  • Documents :  1: 存入一些永远不被删除的文件(不会被系统主动删除),itunes备份时,同时也会备份Documents文件(条件: 尽量不在Documents放入音频视频等太大的东西,只放一些重要文件,以免审核被拒) 注 :可以存,有方法让什么

  • Library :    1 Caches : 存储缓存的文件夹  当用户对某一个URL做请求操作的时候,这个URL里面的东西会保存在主机里面的某个位置 . Cookie 和Session . (itunes不会备份此目录,文件不会再应用退出时删除,一般存放比较大,不是特别重要的资源)
       
                         2: Preferences  保存应用的所有偏好设置.iOS的Settings(设置) 应用会该目录中查找应用的设置信息,iTunes会备份它,  注意: 不应该直接创建偏好设置文件,而是应该使用类来取得和设置应用程序的偏好 
                     
  • tmp : 保存应用运行时所需的临时数据,使用完毕后会将相应的文件从该目录删除.应用没有运行时或者手机重启时 ,系统也有可能会清除该目录下的文件,iTunes 不会同步该目录

获取文件夹方法 
  •        第一种 :  通过该NSSeach搜索文件夹得地址,能获取Documents 和Library 内部文件夹地址, 但是不能获取tmp文件夹得地址,其他的都可以获取到.

       //NSDocumentDirectory 表示获取Documents文件夹得地址
   
//NSLibraryDirectory / NSCachesDirectory
   
//NSUserDomainMask  表示用户的主目录
   
//第三个参数表示 展开"~" 的地址,设置为YES 为完整路径
   
//NSSearchPathForDirectoriesInDomains获取的是一个数组(NSArray<NSString *> *),数组只有一个元素,所以可以直接获取objectAtIndex: 0 ;
   
NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
    NSLog(@"%@",documentPathStr);
  •       第二种  : 首先获取沙盒主路径的地址,然后拼接上想要去的文件夹的地址.
    
    //首先获取沙盒主路径的地址
   
NSString *homePathStr = NSHomeDirectory();
   
NSLog(@"homePathStr = %@",homePathStr);
   
//其次: 在沙盒主路径后拼接Documents,拼接出来documents文件夹的路径
   
NSString *documentsPathStr = [homePathStr stringByAppendingPathComponent:@"Library/Caches"];
   
NSLog(@"documents = %@",documentsPathStr);
   
//获取tmp文件夹得路径
   
NSString *tmpPathStr = NSTemporaryDirectory();
    NSLog(@"tmpPathStr = %@",tmpPathStr);




               简单对象的写入与读写



——————————————数据本地化
      把数据的,存储到应用程序的沙盒里面
  •    写入
    //1 . 要知道存到哪里 ,So需要一个文件夹的路径
   
NSString *documentsPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
   
NSLog(@"%@",documentsPathStr);
   
//2 . 知道要存什么 创建数据
   
NSString *str = @"hello world";
   
//3 . 要知道数据放哪里 , 创建一个路径,路径的终点局势存数据的文件 Component(成分)
   
NSString *strPath = [documentsPathStr stringByAppendingPathComponent:@"str.txt"];
   
//4 . 写入操作
   
// atomically : YES 正当手机没电关机 会保存文件
   
//              NO  
   
// encoding : 编码方式
    [str
writeToFile:strPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
   
  •  读取
    //通过路径读取数据,使用stringWithContentsOfFile方法,在读取的时候,第一个参数表示读取文件的路径,第二个参数表示编码格式,第三个表示错误信息.
    NSString *newStr = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncoding error:nil];


——————————————NSData
    /*
   
根据imageName获取图片:会在缓存里存一份,下次在获取同名图片,直接从缓存里取. 优点 : ,只有第一次的时候慢 ,但是之后再获取的话会很快.    缺点 : 会浪费内存, 如果只用致辞的话这块内存就浪费掉了.
   
根据ContentsOfFile获取到的图片: 每次都会根据路径去取图片,不会占用内存.如果图片只使用一次,推荐使用ContentsOfFile
    UIImage *image1 = [UIImage imageNamed:<#(nonnull NSString *)#>];
    UIImage *image2 = [UIImage alloc]initWithContentsOfFile:<#(nonnull NSString *)#>];
   
   
     123.png
     [email protected]
     [email protected]
    
     2x3x,表示分辨率区别
    // png类型图片,只写名字就行了  写全png类型就指定了 
     */
  • 写入
    //1
    NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
    //2
    UIImage *image = [UIImage imageNamed:@"123"]; 
    //UIImage类型对象转化成NSData类型的
    //第一个参数 :转哪个UIImage类型对象
    //第二个参数:压缩系数,越小压缩越厉害
    NSData *data =UIImageJPEGRepresentation(image, 1); 
    //3
    NSString *stringPath = [documentPathStr stringByAppendingPathComponent:@"stringPath.txt" ];
    //4
    [data  writeToFile:stringPath atomically:YES];
    
  • 读取数据
    NSData *newData = [NSData dataWithContentsOfFile:stringPath];
   
UIImage *newImage = [UIImage imageWithData:newData];
   
UIImageView *newImageView = [[UIImageView alloc]initWithImage:newImage];
    [self.view addSubview:newImageView];




                                  复杂对象的写入与读取

             
 什么是复杂对象?  
     在Foundation框架内不存在的数据类,如自定义Person类等 无法在程序内通过writeToFile: 这个方法写入文件内
     只能通过将负载对象转化为NSData,即归档

 
——————————————归解档

             
#import <Foundation/Foundation.h>
// 如果一个对象向直接写入本地,那么这个对象需要遵守NSCoding协议
@interface Person : NSObject<NSCoding>

@property(nonatomic,copy)NSString * name;

@property(nonatomic,copy)NSString * gender;

@property(nonatomic,assign)NSUInteger  age;

//nonatomic assign copy atomic weak strong readonly readwrite writeonly nonnull nullable retain unsafe_unretained

//_+属性名 命名的成员变量
//
@end

                   
#import "Person.h"

@implementation Person

//归档
//在归档和解档的时候,要把所有的属性都进行归解档
-(
void)encodeWithCoder:(NSCoder *)aCoder{
   [aCoder
encodeObject:self.name forKey:@"name"];
    [aCoder
encodeObject:self.gender forKey:@"gender"];
    [aCoder
encodeInteger:self.age forKey:@"age"];
}

//解档
-(
instancetype)initWithCoder:(NSCoder *)aDecoder{
   
if (self = [super init]) {
       
self.name = [aDecoder decodeObjectForKey:@"name"];
       
self.gender = [aDecoder decodeObjectForKey:@"gender"];
       
self.age = [aDecoder decodeIntegerForKey:@"age"];
    }
   
return self;
}
@end


#import "ViewController.h"
#import
"Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (
void)viewDidLoad {
    [
super viewDidLoad];
    // 如果一个对象向直接写入本地,那么这个对象需要遵守NSCoding协议

    Person *person = [[Person alloc]init];
    person.
name = @"";
    person.
gender = @"";
    person.
age = 38 ;
   
#pragma mark ------归档
    //将复杂对象归档之后存入本地
    // 1 : 创建一个NSMutableData ,用于保存归档后的对象(初始化归档工具)
    NSMutableData *data = [NSMutableData data];
    // 2 : 创建个归档工具
   
NSKeyedArchiver *keyedArchiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    // 3 : 归档
    [keyedArchiver encodeObject:person forKey:@"person"];
    //第 4 步: 结束归档
    [keyedArchiver finishEncoding];//这时候才Data存储好数据
    NSLog(@"data = %@",data);
    //获取,拼接写入沙盒路径
 NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
    NSString *dataPath = [documentPathStr stringByAppendingPathComponent:@"person.plist"] ;
    //x写入
    [data writeToFile:dataPath atomically:YES];
   
   
   
#pragma mark --------解档并使用
    // 1 : 从本地获取到Data
   
NSData  *newData = [NSData dataWithContentsOfFile:dataPath];
   
NSLog(@"%@",newData);
   
// 2 : 通过获取到的data 创建一个解档工具
   
NSKeyedUnarchiver *keyedUnarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:newData];
   
// 3 :创建一个Person对象,接收解档结果
   
Person *newPerson = [keyedUnarchiver decodeObjectForKey:@"person"];
   
// 4 :结束解档
    [keyedUnarchiver
finishDecoding];
   
//
   
NSLog(@"%@",newPerson);
   
   
//归解档是一种编码方式,不是数据本地化的方式
   
//负载对象写入本地实际上使用的还是writeToFile 的简单写入本地的方法
   
//整存整取 writeToFile
    //在一个路径下存数据,最后一次存进去的东西会覆盖之前的



总结



  • 简单对象写入文件过程: 
  1. 创建字符串获取存储文件的文件夹路径
  2. 创建需要存储的数据
  3. 创建字符串通过拼接创建并获得存储文件的路径
  4. 写入 writeToFile

  • 读取: 通过路径读取数据,使用stringWithContentsOfFile方法

  • 归档:
  1. 创建对象 (并设置属性)
  2. 遵循NSCoding协议,并实现方法
  3. 创建实例对象
  4. 创建NSData用来存储对象并初始化归档工具
  5. 创建归档工具
  6. 归档
  7. 结束归档
  8. 获取,拼接沙盒文件路径
  9. 写入

  • 解档
  1. 获取沙盒文件路径
  2. 创建NSData,并接收本地数据
  3. 创建解档工具,通过NSData
  4. 创建对象,并接收解档结果
  5. 结束解档


  • 什么类型的对象可以直接存入本地?  
  1. NSString(在写入本地和读取时,都需要进行UTF8转码)
  2. NSArray
  3. NSDictionary
  4. NSData {
  • NSData如何转出UIImage :   imageWithData:NSData
  • UIImage如果转成NSData :   UIImageJPEGRepresentation(UIImage *, CGFloat);
}
  • 存入本地的过程? 
1.找到存储的路径
2.创建要存储的数据
3.创建存储数据的内容
4.存储数据


     数据本地化的方式 :
  1.      直接写入本地
  2.      sqlite
  3.      CoreData
  4. NSUserDefaultes(属性列表,并不是数据本地化的一个方式,但是可以达成数据本地化)
         归解档


  • 传值的方式: 
  1. block
  2. 代理
  3. 属性
  4. 单例
  5. 通知中心
  6. 数据本地化

  • 设计模式(实现方式)
  1. 单例
  2. 代理
  3. Target-Action
  4. 通知中心

MVC:框架的设计方式

任务
//通讯录 添加和删除 联系人时 下次打开有变化 



documents(n.文档)
Directory( n. [计] 目录;)
Domain(n. 领域;域名;)
Component(n. 成分;组件;)
Representation(n. 代表;表现)
encode(vt. (将文字材料)译成密码;编码,)
decode(vt. [计][通信] 译码,解码)
ćīŚǂvş
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章