數(shù)據(jù)持久性的方式 (三類)
1. NSKeyedArchiver - 對象歸檔
2. NSUerDefaults, 屬性列表
3. SQLite數(shù)據(jù)庫 和 Core Data 數(shù)據(jù)庫
以上 區(qū)別 SQlite數(shù)據(jù)庫和Core Data 的主要用于存儲大型的數(shù)據(jù), NSUerDefaults 則多用于存儲個人偏好設置!
NSCode
1. 用于數(shù)據(jù)歸檔就是指將對象寫入本地保存在硬盤中, 當再次重新打開程序的時候, 程序啟動的時候, 新分配的對象可以解碼之前保存的描述, 然后恢復到之前運行時候的狀態(tài)!。也稱:對象序列化、對象持久化。
2. 這種以某種存儲形式可以使自定義對象持久化, 或者將這種對象從一個地方傳輸?shù)搅硪坏胤? 可用于數(shù)據(jù)流的傳輸!!
所以, 它主要那個用于小型得直接存儲一些自定義的類對象! 和一些簡單數(shù)據(jù)!
歸檔方式
注意: 要使用歸檔, 必須要簽NSCoding 或 NSMutableCoding協(xié)議
1. 對Foundation庫中對象進行歸檔 (系統(tǒng)自帶的類, 已經簽好了)
@interface NSString :NSObject <NSCoping, NSMutableCoping, NSSecureCoding>
NSSercureCoding 表示已經簽了協(xié)議了!
2. 自定義對象進行歸檔(需要自己實現(xiàn)歸檔協(xié)議,NSCoding)
系統(tǒng)的方法挺人性化, 考慮到了好多因素!
例子 1:
NSArray *arr =@[@"111",@"222",@"333"]; // 定義一個數(shù)組
// 取一個地址
NSArray *documents =NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documents[0] stringByAppendingPathComponent: @" multiPersonInfo.plist" ];
// 歸檔
[NSKeyedArchiver archiveRootObject:arr toFile:path]; //直接存入本地
NSArray *newArr = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; // 反歸檔, 直接取出!!
例子 2: 用于自定義的類
要簽協(xié)議,并且使用 NSCoding 的兩個方法!
- (void)encodeWithCoder:(NSCoder)aCoder 和
- (id)initWithCoder:(NSCoder)aDecoder 分別用于歸檔和反歸檔
定義一個類!
boss.h
#import <Foundation/Foundation.h>
@interfaceboss :NSObject <NSCoding>
@property(nonatomic,retain)NSString*name;
@property(nonatomic,assign)NSIntegernumber;
@property(nonatomic,retain)NSString*sex;
@end
boss.m文件
#import"boss.h"
@implementationboss
- (void)encodeWithCoder:(NSCoder*)aCoder
{//編碼的方法,將數(shù)據(jù)編碼成可以寫入本地的狀態(tài)
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.sex forKey:@"sex"];
[aCoder encodeInteger:self.number forKey:@"number"];
}
- (id)initWithCoder:(NSCoder*)aDecoder
{//解碼方法,從本地讀取數(shù)據(jù),重新創(chuàng)建對象進行初始化
self= [superinit];
if(self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
self.number= [aDeco derdecodeIntegerForKey:@"number"];
}
return self;
}
調用:
boss*bosss = [[boss alloc]init];
bosss.name = @"老王";
boss.number = 30;
bosss.sex=@"unknown";
NSString *bossPath = [paths tringByAppendingPathComponent:@"boss.aa"];
[NSKeyedArchiver archiveRootObject: bosss toFile: bossPath];
反歸檔類重新產生一個新對象
boss *bossReturn = [NSKeyed UnarchiverunarchiveObjectWithFile:bossPath];
NSLog(@"%@", bossReturn.name);
但當為單個對象的時候, 可以調用一下方法, 使用archiveRootObject:toFile:方法可以將一個對象直接寫入到一個文件中,但有時候可能想將多個對象寫入到同一個文件,那么可以使用NSData來歸檔對象,NSData可以為一些數(shù)據(jù)提供臨時存儲空間,以便隨后寫入文件,或者存放從磁盤讀取的文件內容??梢允褂?code>[NSMutableData data] 創(chuàng)建可變數(shù)據(jù)空間
多個對象歸檔
定義第一對象 boss *bosss1 = [[boss alloc]init];
bosss1.name = @"老王";
bosss1.number = 30;
bosss1.sex = @"unknown";
定義第二個對象
boss *bosss2 = [[boss alloc]init];
bosss2.name = @"老王";
bosss2.number = 30;
bosss2.sex = @"unknown";
NSArrar *setArray = [NSArray arrayWithObjects:bosss1, bosss2,nil];//學生對象數(shù)組,里面包含bosss1 和 bosss2兩個對象;
NSData*bossData = [NSKeyedUnarchiver ArchiverarchivedDataWithRootObject: stuArray];//歸檔
NSLog(@"data = %@",stuData);
然后再把bossData寫入本地!!!
當然也不必須轉換成 NSData, 也可以存儲。
NSArray *bossArray2 =[NSKeyedUnarchiver unarchiveObjectWithData: bossData];//逆歸檔
若是數(shù)組存儲的是自定義類的對象, 用writeToFile:<#(NSString *)#> atomically:<#(BOOL)#>寫入本地是不可以的!!