首先來(lái)看一下iOS的數(shù)據(jù)持久化的存儲(chǔ)方式都有哪幾類(lèi)?分別適用于什么場(chǎng)合?
1).XML屬性列表(Property List 常簡(jiǎn)稱(chēng)為Plist)
適用場(chǎng)合:只能存儲(chǔ)OC常用數(shù)據(jù)類(lèi)型(NSString膀篮、NSDictionary舔琅、NSArray建车、NSData统捶、NSNumber等類(lèi)型),而不能直接存儲(chǔ)自定義模型對(duì)象
2).偏好設(shè)置:保存比較簡(jiǎn)單的用戶(hù)信息,NSUserDefaults是個(gè)單例類(lèi)死嗦,用于存儲(chǔ)少量數(shù)據(jù)褒繁。NSUserDefaults實(shí)際上對(duì)plist文件操作的封裝犬庇,更方便我們直接操作俯渤,一般用于存儲(chǔ)系統(tǒng)級(jí)別的偏好設(shè)置呆细。比如我們經(jīng)常將登錄后的用戶(hù)的一些設(shè)置(比如UserName和PassWord)通過(guò)NSUserDefaults存儲(chǔ)到plist文件中。
3).對(duì)象歸檔:保存自定義的對(duì)象,一次性存儲(chǔ)(遵守協(xié)議 實(shí)現(xiàn)方法) 大批量數(shù)據(jù)效果不太好.自定義對(duì)象應(yīng)用范圍很廣八匠,因?yàn)樗鼘?duì)應(yīng)著MVC中的Model層絮爷,即實(shí)體類(lèi)。對(duì)自定義對(duì)象的歸檔顯得重要的多梨树,因?yàn)楹芏嗲闆r下我們需要在Home鍵之后保存數(shù)據(jù)坑夯,在程序恢復(fù)時(shí)重新加載,歸檔是一個(gè)好的選擇.
4).SQLite:輕型的嵌入式關(guān)系型數(shù)據(jù)庫(kù)(主要做緩存:就是當(dāng)用戶(hù)打開(kāi)界面時(shí),顯示的不是空白) ,它占用資源非常的低,只能放在在手機(jī)里
5).CoreData
CoreData是對(duì)SQLite的封裝,面向過(guò)程(沒(méi)有sql語(yǔ)句),對(duì)存儲(chǔ)方式的封裝,可以讓用戶(hù)在不關(guān)心數(shù)據(jù)的情況在對(duì)數(shù)據(jù)進(jìn)行增刪改查的操作.
Core Data是iOS5之后才出現(xiàn)的一個(gè)框架抡四,它提供了對(duì)象-關(guān)系映射(ORM)的功能柜蜈,即能夠?qū)C對(duì)象轉(zhuǎn)化成數(shù)據(jù),保存在SQLite數(shù)據(jù)庫(kù)文件中指巡,也能夠?qū)⒈4嬖跀?shù)據(jù)庫(kù)中的數(shù)據(jù)還原成OC對(duì)象淑履。在此數(shù)據(jù)操作期間,不需要編寫(xiě)任何SQL語(yǔ)句.
首先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
//設(shè)置成員變量
@property (nonatomic, strong) NSManagedObjectContext *context;
@property (nonatomic, strong) NSArray *allDatas;
//NSPersistentStoreCoordinator
//持久化存儲(chǔ)小助手 (負(fù)責(zé)創(chuàng)建數(shù)據(jù)庫(kù))
//操作權(quán)限 上下文 (負(fù)責(zé)增刪改查)
NSManagedObjectContext *context = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
self.context = context;
//指定一個(gè)持久化存儲(chǔ)小助手 創(chuàng)建數(shù)據(jù)庫(kù)
//告訴小助手創(chuàng)建一個(gè)怎樣的數(shù)據(jù)庫(kù)
NSString *path = [[NSBundle mainBundle]pathForResource:@"_coreData" ofType:@"momd"];
//管理器對(duì)象的模型 參數(shù)1 url 路徑
NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc]initWithContentsOfURL:[NSURL fileURLWithPath:path]];
NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:managedObjectModel];
//沙盒路徑
NSString *pathDatabase = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"coreData.sqlite"];
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:pathDatabase] options:nil error:nil];
context.persistentStoreCoordinator = persistentStoreCoordinator;
macdown
//有了上下文 有了小助手
//創(chuàng)建一個(gè)實(shí)體 有Police的信息姓名 身高 體重屬性
NSLog(@"%@",pathDatabase);
向?qū)嶓w(數(shù)據(jù)表)添加數(shù)據(jù)
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"XSPolice" inManagedObjectContext:self.context];
XSPolice *police = [[XSPolice alloc]initWithEntity:entityDescription insertIntoManagedObjectContext:self.context];
police.name = [NSString stringWithFormat:@"張三-%zd",i];
police.height = @(1.8);
police.weight = @(80);
[self.context save:nil];