數據持久化之歸檔

/*
//    原始數據
    NSArray *list = @[@{@"name":@"奈何",@"age":@180,@"height":@180}];
//    取到原始數據的某一條數據
    NSDictionary *info = list[0];

//    把獲取下來的這條數據轉換成model
    Model *model = [[Model alloc] init];
//    把這條數據key對應的值,賦給model的屬性
    model.name = info[@"name"];
//    把獲取下來的值轉換成對應的屬性
    model.age = [info[@"age"] integerValue];
//
    model.height = [info[@"height"] floatValue];
    */
   
    /*
//    讀取plist文件裏面的內容
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"plist"];
   
    NSArray *list = [NSArray arrayWithContentsOfFile:path];

    NSMutableArray *array = [NSMutableArray array];
   
    for (NSDictionary *info in list) {
        Model *user = [[Model alloc] init];
        user.name = info[@"name"];
        user.age = [info[@"age"] integerValue];
        user.height = [info[@"height"]floatValue];
//        把轉換好的model添加到以後要使用的數組裏面
        [array addObject:user];

    }
   
    Model *one = array[0];
    NSLog(@"%@ %ld %f",one.name,one.age,one.height);
    */

  /*  NSString *path = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"plist"];
   
    NSArray *list = [NSArray arrayWithContentsOfFile:path];
   
    NSMutableArray *userList = [NSMutableArray array];
    for (NSDictionary *info in list) {
       
        Model *user = [[Model alloc] initWithUserInfo:info];
//        把賦值的方法移動到構造方法裏面
        user.name = info[@"name"];
       
        [userList addObject:user];
    }
   */
    /*
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"plist"];
   
    NSArray *list = [NSArray arrayWithContentsOfFile:path];
   
    NSMutableArray *userList = [NSMutableArray array];
   
    for (NSDictionary *info in list) {
//        把初始化model對象的方法隱藏到類方法(modelWithUserInfo)裏面
        Model *user = [Model modelWithUserInfo:info];
        [userList addObject:user];
    }
   */
#pragma mark-----------------------------------
/*
 歸檔->數據持久化的方式->加密(把文件加密,不是把數據加密)。
 歸檔分爲存儲數據(編碼的過程、或叫序列化的過程、或歸檔過程)。
 讀取數據(解碼、反序列化、解歸檔)。
 
 可以歸檔的對象:必須遵守歸檔協議,實現協議方法。纔可以進行歸檔。
 歸檔:NSCoding
 除了NSObject未實現歸檔協議,其他實現了協議的類都可以歸檔(UIViewUIViewControllerUIImage...
 
 歸檔的類名:NSKeyedArchiver
 解歸檔類名:NSKeyedUnarchiver
 
 歸檔、解歸檔都是通過key來歸檔和解歸檔的
 在歸檔和解歸檔的時候key一定要對應,儘量和對象名相同
 
 */
   
   
// 歸檔的步驟
//1、寫歸檔存儲文件的路徑
//2、準備要歸檔的數據
//3、開始歸檔
 /*
    //1、寫歸檔存儲文件的路徑
    NSArray *serchList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
//    歸檔文件的尾綴儘量.archiver
    NSString *path = [[serchList lastObject] stringByAppendingPathComponent:@"list.archiver"];
  
    //2、準備要歸檔的數據
   NSArray *list = @[@{@"name":@"奈何",@"age":@180,@"height":@180}];
    //3、開始歸檔
//    + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;
//    把一個支持object(支持歸檔)類型的數據,以歸檔的形式存儲到指定位置
//    支持歸檔協議的對象,系統幫忙對他進行了編碼
    BOOL isSuccess = [NSKeyedArchiver archiveRootObject:list toFile:path];
    if (isSuccess) {
        NSLog(@"%@",path);
    }
    */
    /*
//    解歸檔的步驟
//    1、歸檔文件的路徑
//    2、開始解歸檔
    //    1、歸檔文件的路徑
    NSArray *serchList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    //    歸檔文件的尾綴儘量.archiver
    NSString *path = [[serchList lastObject] stringByAppendingPathComponent:@"list.archiver"];
    //    2、開始解歸檔
   NSArray *list = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"%@",list);
//    NSDictionary *dic = @{@"name":@"..."};歸檔到字典
    */
//    NSData二進制的類,可以把文件或者數據轉換成二進制的對象
//  NSMutableData
   
//    NSDate時間的類
/*
 歸檔多種數據
 1、存儲路徑
 2、初始化一個可變的二進制對象,同時準備要歸檔的數據
 3、歸檔等待寫入數據的二進制對象(要使用歸檔的數據,對需要的歸檔的數據進行編碼)
 4、使用歸檔對象,對要歸檔的數據進行編碼(編碼結束後同時寫入到二進制對象)
 5、編碼結束(把編碼後的數據寫入到二進制數據《系統操作》現在二進制對象裏面已經存在編碼之後的數據
 
 6、把二進制對象存儲到指定位置(歸檔成功)
 */
    /*
//    1、存儲路徑
    NSArray *searchList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [[searchList lastObject] stringByAppendingPathComponent:@"user. archiver"];
 
//   2 初始化一個可變的二進制對象,同時準備要歸檔的數據
    //    準備要歸檔的數據
    NSString *name = @"肖耐";
    NSInteger age = 18;
    float height = 180;
//    初始化一個可變的二進制對象
    NSMutableData *data = [NSMutableData data];
//    3、歸檔等待寫入數據的二進制對象
//  - (instancetype)initForWritingWithMutableData:(NSMutableData *)data
//    二進制文件等待寫入->讓歸檔對象幫他寫入(編碼結束,就會把編碼後的數據,寫入到二進制對象)
    NSKeyedArchiver *arc = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//     4、使用歸檔對象,對要歸檔的數據進行編碼(同是寫入到二進制對象)
//    編碼使用encode,解碼使用decode
//    要用對應的數據類型進行編碼
    [arc encodeObject:name forKey:@"name"];
    [arc encodeInteger:age forKey:@"age"];
    [arc encodeFloat:height forKey:@"height"];
//    5、編碼結束。編碼結束之後,會把編碼之後的數據寫入到二進制對象
    [arc finishEncoding];
//     6、把二進制對象存儲到指定位置(歸檔成功)
   
   BOOL isSuccess =  [data writeToFile:path atomically:YES];
    if (isSuccess) {
        NSLog(@"歸檔路徑=%@",path);
    }
    */
    /*
//    多重數據存到同一個歸檔文件解歸檔
//    1、歸檔文件的路徑
//    2、使用data 讀取數據準備解歸檔data裏面的數據
//    3、解歸檔數據,用對應的數據類型接收
//    decode解碼
//    - (instancetype)initForReadingWithData:(NSData *)data;
//    NSData *readData = [[NSData dataWithContentsOfFile:path];
//    2、使用data 讀取數據準備解歸檔data裏面的數據
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[NSData dataWithContentsOfFile:path]];
// 3、解歸檔數據,用對應的數據類型接收
    NSString *name = [unarchiver decodeObjectForKey:@"name"];
    NSInteger age = [unarchiver decodeIntegerForKey:@"age"];
    float height = [unarchiver decodeFloatForKey:@"height"];
   
    NSLog(@"%@ %ld %f",name,age,height);
    */
   
   
/*
 自定義歸檔:有些數據不能歸檔,歸檔必須遵守歸檔協議(NSCoding
 歸檔、解歸檔都與第一種方式相同

 */
    
//當在歸檔位置(ViewController中)調用[NSKeyedArchiver archiveRootObject:XXX toFile:XXX];會自動調用下面的歸檔協議方法- (void)encodeWithCoder:(NSCoder *)aCoder

//歸檔在使用歸檔的方法的時候,會調用這個協議方法
- (
void)encodeWithCoder:(NSCoder*)aCoder{
//  aCoder就是系統傳過來的NSKeyedArchiver實例化出來的對象
    [aCoder
encodeObject:self.nameforKey:@"name"];
    [aCoder
encodeInteger:self.ageforKey:@"age"];
    [aCoder
encodeFloat:self.heightforKey:@"height"];
}
//解歸檔的時候會自動調用initWithCoder
- (
nullable instancetype)initWithCoder:(NSCoder*)aDecoder{
//    只要是構造方法,先把創建對象的方法補全
   
self = [super init];
   
if (self) {
//        當使用解歸檔方法的時候系統會自動調用initWithCoder:(NSCoder *)aDecoder。系統會自動幫咱們創建一個對象。之前對象數據保存在歸檔文件裏面,在解歸檔的時候,還原數據並且把還原的數據賦值給這個對象->現在這個對象的數據,跟原來歸檔時候的數據是一樣的。
       
self.name= [aDecoder decodeObjectForKey:@"name"];
       
self.age= [aDecoder decodeIntegerForKey:@"age"];
       
self.height= [aDecoder decodeFloatForKey:@"height"];
    }
   
return self;
}


   UserModel *user = [[UserModel alloc] init];
    user.
name = @"鳳輕塵";
    user.
age = 160;
    user.
height = 163;
   
   
NSString *path = [NSHomeDirectory()stringByAppendingPathComponent:@"user.archiver"];
  
BOOL isSuccess = [NSKeyedArchiver archiveRootObject:user toFile:path];
   
if (isSuccess) {
       
NSLog(@"%@",path);
    }
   
  
UserModel *nowUser =  [NSKeyedUnarchiver unarchiveObjectWithFile:path];
   
NSLog(@"%@  %ld  %f",nowUser.name,nowUser.age,nowUser.height);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章