沙盒本地数据化

来源:互联网 发布:淘宝双12活动报名 编辑:程序博客网 时间:2024/06/02 18:46
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:strPathatomically:YESencoding:NSUTF8StringEncodingerror:nil];
   
  •  读取
    //通过路径读取数据,使用stringWithContentsOfFile方法,在读取的时候,第一个参数表示读取文件的路径,第二个参数表示编码格式,第三个表示错误信息.
   NSString *newStr = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncodingerror:nil];


——————————————NSData
   /*
   
根据imageName获取图片:会在缓存里存一份,下次在获取同名图片,直接从缓存里取.优点 : ,只有第一次的时候慢 ,但是之后再获取的话会很快.   缺点 : 会浪费内存,如果只用致辞的话这块内存就浪费掉了.
   
根据ContentsOfFile获取到的图片:每次都会根据路径去取图片,不会占用内存.如果图片只使用一次,推荐使用ContentsOfFile
    UIImage *image1 = [UIImage imageNamed:<#(nonnull NSString *)#>];
    UIImage *image2 = [UIImage alloc]initWithContentsOfFile:<#(nonnull NSString *)#>];
   
   
     123.png
     123@2x.png
     123@3x.png
    
     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:stringPathatomically:YES];
    
  • 读取数据
   NSData *newData = [NSData dataWithContentsOfFile:stringPath];
   
UIImage *newImage = [UIImageimageWithData:newData];
   
UIImageView *newImageView = [[UIImageViewalloc]initWithImage:newImage];
    [self.viewaddSubview:newImageView];




                                  复杂对象的写入与读取

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

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

             
#import<Foundation/Foundation.h>
//如果一个对象向直接写入本地,那么这个对象需要遵守NSCoding协议
@interfacePerson : 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.nameforKey:@"name"];
    [aCoder
encodeObject:self.genderforKey:@"gender"];
    [aCoder
encodeInteger:self.ageforKey:@"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 = [NSMutableDatadata];
   //2 : 创建个归档工具
   
NSKeyedArchiver *keyedArchiver = [[NSKeyedArchiveralloc]initForWritingWithMutableData:data];
   //3 : 归档
    [keyedArchiverencodeObject:personforKey:@"person"];
    //第 4 步: 结束归档
    [keyedArchiverfinishEncoding];//这时候才Data存储好数据
   NSLog(@"data = %@",data);
    //获取,拼接写入沙盒路径
 NSString*documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
   NSString *dataPath = [documentPathStr stringByAppendingPathComponent:@"person.plist"] ;
    //x写入
    [datawriteToFile:dataPathatomically:YES];
   
   
   
#pragma mark --------解档并使用
    // 1 :从本地获取到Data
   
NSData  *newData = [NSDatadataWithContentsOfFile:dataPath];
   
NSLog(@"%@",newData);
   
//2 : 通过获取到的data 创建一个解档工具
   
NSKeyedUnarchiver*keyedUnarchiver = [[NSKeyedUnarchiveralloc]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ş
0 0
原创粉丝点击