IOS-數據存儲之NSkeyedArchiver用法

Archiver簡單用法:

1.用處很大. 但是用起來 比較麻煩.要從程序設計的時候就 把每一個類實現這個功能 .將內存中的 對象實例保存成 binary 到 磁盤 並且可以 逆向這個過程 用來保存 用戶操作狀態.

2.歸檔操作(NSkeyedArchiver),不同於其他數據存儲,它可以把自定義對象存放在文件中。

對於一個應用來說,有唯一的沙盒與之對應,即每個應用不能跨沙盒操作文件。


代碼示例:

需要注意的是,需要保存的對象類一定要引用NSCoding協議,並且實現

- (void)encodeWithCoder:(NSCoder *)aCoder

- (id)initWithCoder:(NSCoder *)aDecoder   


#pragma mark Demo_3
- (void)saveDataWithArchive{
    
    NSString *documentDirectoy = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject ];
    //這裏路徑可以直接生成 test.archiver 文件,方便查看裏面存儲的內容暫且保存一個plist去archiver
    NSString *path = [documentDirectoy stringByAppendingPathComponent:@"test.plist"];
    NSLog(@"Archiver.path---%@",path);
    
    record *tempRecord = [[record alloc]init];
    tempRecord.aa = [NSNumber numberWithInt:10];
    tempRecord.bb = @"b10_test";
    tempRecord.cc = [NSNumber numberWithInt:100];
    tempRecord.dd = [NSNumber numberWithInt:1000];
    tempRecord.ee = @"e10_test";
    
    [NSKeyedArchiver archiveRootObject:tempRecord toFile:path];
    NSLog(@"Archiver 數據已存儲.");
}

- (void)readDatafromArchive{
    NSString *documentDirectoy = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    //這裏路徑可以直接生成 test.archiver 文件,方便查看裏面存儲的內容暫且保存一個plist去archiver
    NSString *path = [documentDirectoy stringByAppendingPathComponent:@"test.plist"];
    
    record *tempRecord = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"aa=%@\n bb=%@\n cc=%@\n dd=%@\n ee=%@",tempRecord.aa,tempRecord.bb,tempRecord.cc,tempRecord.dd,tempRecord.ee);
    NSLog(@"Archiver 數據已取出");
}

自定義類:

//

#import "record.h"

@implementation record

#pragma mark - NSCodeing協議方法(一定要實現)
//當進行歸檔操作的時候就會調用該方法
//在該方法中要寫清楚要存儲對象的那些屬性
- (void) encodeWithCoder:(NSCoder *)aCoder{
    NSLog(@"調用了encodeWithCoder方法");
    [aCoder encodeObject:_aa forKey:@"aaa"];
    [aCoder encodeObject:_bb forKey:@"bbb"];
    [aCoder encodeObject:_cc forKey:@"ccc"];
    [aCoder encodeObject:_dd forKey:@"ddd"];
    [aCoder encodeObject:_ee forKey:@"eee"];
    
}

//當進行解檔操作的時候就會調用該方法
//在該方法中要寫清楚要提取對象的哪些屬性
- (id)initWithCoder:(NSCoder *)aDecoder{
    NSLog(@"調用了initWithCoder方法");
    if (self = [super init]) {
        self.aa = [aDecoder decodeObjectForKey:@"aaa"];
        self.bb = [aDecoder decodeObjectForKey:@"bbb"];
        self.cc = [aDecoder decodeObjectForKey:@"ccc"];
        self.dd = [aDecoder decodeObjectForKey:@"ddd"];
        self.ee = [aDecoder decodeObjectForKey:@"eee"];
    }
    return self;
}

@end



打印結果:


 

文件查看:



哈哈,其實也就這麼簡單!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章