IOS數據持久化的方式分為三種:
下面主要來介紹一個歸檔NSKeyedArchiver。
歸檔(又名序列化),把對象轉為字節碼,以文件的形式存儲到磁盤上;程序運行過程中或者當再次重寫打開程序的時候,可以通過解歸檔(反序列化)還原這些對象。
歸檔方式:
- 對Foundation框架中對象進行歸檔
- 對自定義的內容進行歸檔
- 對自定義的對象進行歸檔
//獲得文件路徑 NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.archiver"]; //歸檔(序列化) NSArray *archiveAry = @[@"jereh",@"ios"]; if ([NSKeyedArchiver archiveRootObject: archiveAry toFile:filePath]) { NSLog(@"Archiver success"); } //解歸檔(反序列化) NSArray *unArchiveAry = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; NSLog(@"%@",unArchiveAry);
小結:
- 歸檔和解歸檔操作步驟簡單
- 一次只能歸檔一個對象,如果是多個對象歸檔需要分開進行
- 歸檔的對象是Foundation框架中的對象
- 歸檔和解歸檔其中任意對象都需要歸檔和解歸檔整個文件
- 歸檔後的文件是加密的,所以歸檔文件的擴展名可以隨意取
//獲得文件路徑 NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.archiver"]; //1. 使用NSData存放歸檔數據 NSMutableData *archiverData = [NSMutableData data]; //2. 創建歸檔對象 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiverData]; //3. 添加歸檔內容 (設置鍵值對) [archiver encodeObject:@"jereh" forKey:@"name"]; [archiver encodeInt:20 forKey:@"age"]; [archiver encodeObject:@[@"ios",@"oc"] forKey:@"language"]; //4. 完成歸檔 [archiver finishEncoding]; //5. 將歸檔的信息存儲到磁盤上 if ([archiverData writeToFile:filePath atomically:YES]) { NSLog(@"archiver success"); } //解歸檔 //1. 從磁盤讀取文件,生成NSData實例 NSData *unarchiverData = [NSData dataWithContentsOfFile:filePath]; //2. 根據Data實例創建和初始化解歸檔對象 NSKeyedUnarchiver *unachiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData]; //3. 解歸檔,根據key值訪問 NSString *name = [unachiver decodeObjectForKey:@"name"]; int age = [unachiver decodeIntForKey:@"age"]; NSArray *ary = [unachiver decodeObjectForKey:@"language"]; NSLog(@"name=%@ age=%i ary=%@",name,age,ary);
小結:
- 在帶鍵的歸檔中,每個歸檔字段都有一個key值,解歸檔時key值要與歸檔時key值匹配
- 帶鍵歸檔可以一次存儲多個對象
- 歸檔的對象是Foundation框架中的對象
- 歸檔和解歸檔其中任意對象都需要歸檔和解歸檔整個文件
- 歸檔後的文件是加密的,所以歸檔文件的擴展名可以隨意取
#define IDNUM @"idNum" #define NAME @"name" @interface Student : NSObject <NSCoding> @property (nonatomic, assign) int idNum; @property (nonatomic, copy) NSString *name; @end @implementation Student #pragma mark 編碼 對對象屬性進行編碼的處理 - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeInt:_idNum forKey:IDNUM]; [aCoder encodeObject:_name forKey:NAME]; } #pragma mark 解碼 解碼歸檔數據來初始化對象 - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super init]) { _idNum = [aDecoder decodeIntForKey:IDNUM]; _name = [aDecoder decodeObjectForKey:NAME]; } return self; } @end
小結:
- 自定義對象與自定義內容歸檔和解歸檔步驟和用法完全相同
- 自定義的對象歸檔需要實現NSCoding協議,並且實現協議中的方法
- NSCoding協議中有兩個方法:
- encodeWithCoder方法對對象屬性進行編碼,在對象歸檔時調用
- initWithCoder方法解碼歸檔數據來初始化對象,在對象解歸檔時調用
總結: