iOS中承諾關(guān)鍵的數(shù)據(jù)保存方式有六種:NSUserDefaults:、歸檔、文件保存谢澈、sqlite數(shù)據(jù)庫——iOS數(shù)據(jù)庫、CoreData御板、KeyChain锥忿;
1. NSUserDefaults
1.NSUserDefaults不能保存自定義對象。
2.一般保存用戶名怠肋,密碼敬鬓,設(shè)置項(是否記住密碼、是否在2G/3G自動下載圖片,是否離線下載等)
3.保存基本數(shù)據(jù)類型NSString,NSArray,NSDictionary钉答,用法簡單础芍,一般保存少量的數(shù)據(jù)。
用法:
//保存
[[NSUserDefaults standardUserDefaults] setObject: forKey:];
//取值
[[NSUserDefaults standardUserDefaults] objectForKey:];
//立即保存
[[NSUserDefaultsstandardUserDefaults]synchronize];
//移除
[[NSUserDefaults standardUserDefaults] removeObjectForKey:];
二数尿、歸檔
保存自定義的對象仑性,而且也是保存少量數(shù)據(jù)。相對于在使用plist進行數(shù)據(jù)存儲和讀取右蹦,只適用于系統(tǒng)自帶的一些常用類型才能用诊杆,且必須先獲取路徑相對麻煩,且只能存儲常用類型何陆。
//需要實現(xiàn)NSCoding中的協(xié)議的兩個方法
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self == [super init]) {
self.name = [aDecoder decodeObjectForKey:Name];
self.sex = [aDecoder decodeObjectForKey:Sex];
self.age = [[aDecoder decodeObjectForKey:Age] integerValue];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:Name];
[aCoder encodeObject:self.sex forKey:Sex];
[aCoder encodeObject:[NSNumber numberWithInteger:self.age] forKey:Age];
}
//歸檔
NSMutableData *data = [[NSMutableData alloc] init];
//創(chuàng)建歸檔輔助類
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//編碼
[archiver encodeObject:model forKey:@"model"];
//結(jié)束編碼
[archiver finishEncoding];
//寫入到沙盒
NSArray *array =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *fileName = [array.firstObject stringByAppendingPathComponent:@"archiverModel"];
if([data writeToFile:fileName atomically:YES]){
NSLog(@"歸檔成功");
}
//解檔
NSData *undata = [[NSData alloc] initWithContentsOfFile:fileName];
//解檔輔助類
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:undata];
//解碼并解檔出model
TestModel *unModel = [unarchiver decodeObjectForKey:@"model"];
NSLog(@"%@",unModel);
//關(guān)閉解檔
[unarchiver finishDecoding];
三晨汹、文件保存
一般在iOS常用的是plist,一般也是保存少量數(shù)據(jù)贷盲。一般保存數(shù)據(jù)類NSArray,NSDictioanary.此文件包含了應(yīng)用程序的配置信息.系統(tǒng)依賴此文件以獲取應(yīng)用程序的相關(guān)信息
四宰缤、sqlite數(shù)據(jù)庫——iOS數(shù)據(jù)庫
采用SQLite數(shù)據(jù)庫來存儲數(shù)據(jù)。SQLite作為一中小型數(shù)據(jù)庫晃洒,應(yīng)用ios中慨灭,跟前三種保存方式相比,相對比較復(fù)雜一些球及。適合保存大量數(shù)據(jù)氧骤,而且sql增刪改查操作系統(tǒng)都做了優(yōu)化。需要寫sql語句吃引。
五筹陵、CoreData
對sqlite的一個包裝,系統(tǒng)會自動把實體轉(zhuǎn)為sql語句镊尺。好處使用簡單朦佩,而且不需要寫sql語句。適合保存大量數(shù)據(jù)庐氮。
1)初始化方式
NSConfinementConcurrencyType 默認值语稠,允許在特定的線程中執(zhí)行,幾乎不用
NSPrivateQueueConcurrencyType? 只會在主線程中執(zhí)行
NSMainQueueConcurrencyType 允許在子線程中執(zhí)行
-(instancetype)initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct
2)設(shè)置持久化存儲協(xié)調(diào)器(屬性)
persistentStoreCoordinator
2.管理模型
1)獲取url
方法:[[[NSBundle mainBundle] URLForResource:(NSString *)name withExtension:(NSString *)ext]弄砍;
2)加載模型
- (nullable instancetype)initWithContentsOfURL:(NSURL *)url;
3)持久化存儲協(xié)調(diào)器
- (instancetype)initWithManagedObjectModel:(NSManagedObjectModel *)model仙畦;
六、KeyChain
超過沙盒范圍的保存方式音婶,一般保存數(shù)據(jù)是:app刪除了慨畸,但是數(shù)據(jù)不刪除。
一般保存隱私數(shù)據(jù)(用戶密碼衣式,token, cookie)
iPhone沙盒模型的有四個文件夾寸士,分別是documents檐什,tmp,app弱卡,Library厢汹。
1、Documents 目錄:應(yīng)用程序數(shù)據(jù)文件在這個目錄下谐宙。這個目錄用于存儲用戶數(shù)據(jù)或其它應(yīng)該定期備份的信息。
2界弧、AppName.app 目錄:這是應(yīng)用程序的程序包目錄凡蜻,包含應(yīng)用程序的本身。不能進行修改垢箕,否則程序不會運行划栓。
3、Library 目錄:這個目錄下有兩個子目錄:Caches 和 Preferences
Preferences 目錄:包含應(yīng)用程序的偏好設(shè)置文件条获。不能直接創(chuàng)建偏好設(shè)置文件忠荞,而是應(yīng)該使用NSUserDefaults類來取得和設(shè)置應(yīng)用程序的偏好屬性.
Caches 目錄:用于存放緩存文件,保存應(yīng)用程序再次啟動過程中需要的信息帅掘。SDWebImage第三方庫的緩存信息處理都在這個文件中委煤,一般的大容量文件都放在這里。
4修档、tmp 目錄:這個目錄用于存放臨時文件碧绞,保存應(yīng)用程序再次啟動過程中不需要的信息。Nsuserdefaults保存的文件一般在tmp文件夾里吱窝。