所謂歸檔:將復雜對象轉化為NSData類型數據(復雜-->歸檔-->NSData--->WriteToFile)
注意:歸檔是將對象轉化為數據字節,以文件的形式存儲在磁盤上,-
所謂反歸檔:將NSData類型數據轉化為復雜對象(讀取文件-->NSData-->反歸檔--->復雜對象)
再說歸檔之前,先說下iOS的數據持久化方式:
那么問題來了,什么是數據持久化?
數據持久化(俠義的理解):僅僅指把域對象永久保存到數據庫中,(廣義的理解):包括和數據庫相關的各種操作
優點:
1:數據持久化可以減少訪問數據庫數據的次數,增加應用程序執行的速度;
2:代碼重用性高,能夠完成大部分數據庫操作;
3:低耦合,使持久化不依賴于底層數據庫和上層業務邏輯實現,更換數據庫時只需要修改配置文件而不用修改代碼
那么iOS的數據化持久方式有哪些呢?
1:屬性列表(Plist文件),NSUserDefault
2:歸檔(NSKeyedArchiver)
3:數據庫(SQlite,CoreData,FMDB(第三方))
今天重點說下歸檔和結檔的問題
歸檔的三種方式:
1:對foundation框架的對象進行歸檔
2:對自定義的對象進行歸檔
3:對自定義內容進行歸檔
** 注意:歸檔生成的文件是加密的**
下邊舉簡單的例子分別說下歸檔的三種方式
#pragma mark---對自定義對象進行歸檔反歸檔----
- (void)archive{
//先創建一個Person類
/*
第一:復雜對象所屬的類一定要遵循NSCoding協議
第二:實現協議中的方法
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (instancetype)initWithCoder:(NSCoder *)aDecoder;
//歸檔(由叫序列化)的步驟
//對Person類對象進行歸檔時執行此方法.并對Person類中想要進行歸檔的所有屬性,進行序列化操作
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeObject:_gender forKey:@"gender"];
[aCoder encodeObject:_age forKey:@"age"];
}
//反歸檔(由叫反序列化)的步驟
//對Person類對象進行反歸檔時執行此方法.并對Person類中想要進行反歸檔的所有屬性,進行反序列化操作
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
_name = [aDecoder decodeObjectForKey:@"name"];
_gender = [aDecoder decodeObjectForKey:@"gender"];
_age = [aDecoder decodeObjectForKey:@"age"];
}
return self;
}
*/
person *per = [person new];
per.name = @"甲甲";
per.age = @"20";
per.gender = @"女";
//歸檔
//1:準備路徑
NSString *path = NSHomeDirectory();
path = [path stringByAppendingString:@"Singel.plist"];
//2:準備存儲數據對象(用可變數組進行接收)
NSMutableData *data = [NSMutableData new];
//3:創建歸檔對象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
//4:開始歸檔
[archiver encodeObject:per forKey:@"person"];
//5:完成歸檔
[archiver finishEncoding];
//6:寫入文件
BOOL result = [data writeToFile:path atomically:YES];
if (result) {
NSLog(@"歸檔成功:%@",path);
}
//反歸檔
//1:獲取解檔路徑
NSData *MyData = [NSData dataWithContentsOfFile:path];
//2:創建反歸檔對象
NSKeyedUnarchiver *unarchiver= [[NSKeyedUnarchiver alloc]initForReadingWithData:MyData];
//3:反歸檔
person *aper = [person new];
aper = [unarchiver decodeObjectForKey:@"person"];
//4:結束歸檔
[unarchiver finishDecoding];
NSLog(@"%@",aper.name);
}
#pragma mark----對foundation框架中的對象進行歸檔和反歸檔
- (void)fundationClass{
//歸檔
//1:創建路徑
NSString *Doucuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
NSString *path = [Doucuments stringByAppendingString:@"file.plist"];
//2:歸檔(不需要結束方法)
NSArray *array = @[@"jiajia",@"jiejie",@"pangpang"];
BOOL result = [NSKeyedArchiver archiveRootObject:array toFile:path];
if (result) {
NSLog(@"框架中的歸檔%@",path);
}
//反歸檔
NSArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"框架的結檔%@",newArray);
}
#pragma mark----對自定義的內容進行歸檔和反歸檔
- (void)customContent{
//歸檔
//1:獲取路徑
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
path = [path stringByAppendingString:@"custom.plist"];
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
[archiver encodeObject:@"111" forKey:@"name"];
[archiver encodeObject:@"2" forKey:@"gender"];
[archiver encodeObject:@"100" forKey:@"age"];
[archiver finishEncoding];
BOOL result = [data writeToFile:path atomically:YES];
if (result) {
NSLog(@"歸檔%@",path);
}
NSData *newdata = [NSData dataWithContentsOfFile:path];
NSKeyedUnarchiver *unkeyed = [[NSKeyedUnarchiver alloc]initForReadingWithData:newdata];
// NSString *str1 = [unkeyed decodeObjectForKey:@"name"];
// NSString *str2 = [unkeyed decodeObjectForKey:@"gender"];
// NSString *str3 = [unkeyed decodeObjectForKey:@"age"];
person *pp = [person new];
pp.name = [unkeyed decodeObjectForKey:@"name"];
pp.gender = [unkeyed decodeObjectForKey:@"gender"];
pp.age = [unkeyed decodeObjectForKey:@"age"];
[unkeyed finishDecoding];
NSLog(@"name:%@ gender:%@ age:%@",pp.name,pp.gender,pp.age);
// NSLog(@"name:%@ gender:%@ age:%@",str1,str2,str3);
}