Core Data 是數據持久化存儲的最佳方式sql
數據最終的存儲類型能夠是:SQLite數據庫,XML,二進制,內存,或自定義數據類型數據庫
好處:可以合理管理內存,避免使用sql的麻煩,高效數組
構成:xcode
(1)NSManagedObjectContext(被管理的數據上下文)數據結構
操做實際內容(操做持久層)app
做用:插入數據,查詢數據,刪除數據框架
(2)NSManagedObjectModel(被管理的數據模型)編輯器
數據庫全部表格或數據結構,包含各實體的定義信息工具
做用:添加實體的屬性,創建屬性之間的關係fetch
操做方法:視圖編輯器,或代碼
(3)NSPersistentStoreCoordinator(持久化存儲助理)
至關於數據庫的鏈接器
做用:設置數據存儲的名字,位置,存儲方式,和存儲時機
(4)NSManagedObject(被管理的數據記錄)
至關於數據庫中的表格記錄
(5)NSFetchRequest(獲取數據的請求)
至關於查詢語句
(6)NSEntityDescription(實體結構)
至關於表格結構
(7)後綴爲.xcdatamodeld的包
裏面是.xcdatamodel文件,用數據模型編輯器編輯
編譯後爲.momd或.mom文件
構建流程
包括:建立數據上下文,建立數據模型,建立數據持久化存儲助理
生成的工程文件AppDelegate中,會自動生成被管理的數據上下文等相關代碼
方法saveContext表示:保存數據到持久層(數據庫)
方法applicationDocumentsDirectory表示:應用程序沙箱下的Documents目錄路徑
- (void)saveData{
Person * person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:[CYYCoreDataManage shareCoreData].managedContext];
person.name = @"lisi";
person.age = @(29);
person.sex = @(YES);
[[CYYCoreDataManage shareCoreData].managedContext save:nil];
}
被管理的數據上下文
初始化的後,必須設置持久化存儲助理
-(NSManagedObjectContext *)managedContext{
if (_managedContext == nil) {
_managedContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
NSManagedObjectModel * model = [[NSManagedObjectModel alloc]initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"Person" withExtension:@"momd"]];
//協調器
NSPersistentStoreCoordinator * per = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:model];
NSURL * url = [NSURL fileURLWithPath:@"/Users/cai/Desktop/Person/person.db"];
[per addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil];
[_managedContext setPersistentStoreCoordinator:per];
}
return _managedContext;
}
若是不是新工程,也能夠本身寫入相關代碼
(4)此外還生成了TestApp.xcdatamodeld文件
(5)還自動連接了CoreData.framework
(6)在預編譯頭.pch文件中,加入導入了CoreData.h頭文件
#import <CoreData/CoreData.h>
2.建立數據模型(數據模型編輯器操做)
(1)建立實體
選中.xcodedatamodel對象,在右邊的數據模型編輯器的底部工具欄點擊Add Entity添加實體,在最右側欄對實體命名
(2)建立實體屬性
3.插入數據
在AppDelegate.m的application:didFinishLaunchingWithOptions:方法裏,調用自定義方法,insertCoreData插入數據
建立數據上下文,調用insertNewObjectForName方法,建立兩個數據記錄NSManagedObject,而後就能夠對以前數據模型編輯視圖中定義的屬性進行賦值。此時的數據只在內存中被修改,最後調用數據上下文的save方法,保存到持久層
4.查詢數據
在調用了insertCoreData以後,能夠調用自定的查詢方法dataFetchRequest來查詢插入的數據
- (void)fecthData{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:[CYYCoreDataManage shareCoreData].managedContext];
[fetchRequest setEntity:entity];
// Specify criteria for filtering which objects to fetch
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"sex = %@",@"1" ];
[fetchRequest setPredicate:predicate];
// Specify how the fetched objects should be sorted
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
NSArray *fetchedObjects = [[CYYCoreDataManage shareCoreData].managedContext executeFetchRequest:fetchRequest error:nil];
for (Person * person in fetchedObjects) {
NSLog(@"name = %@",person.name);
}
fetchRequest至關於sql查詢語句的包裝類,須要用setEntity方法,來指定具體查詢的實體結構(表結構)
經過NSEntityDescription的entityForName方法來,返回指向該具體實體結構的指針
而後調用executeFetchRequest:error:方法,來執行查詢操做,若是操做成功,則返回對應的數據記錄數組
其中,能夠經過NSManagedObject數據記錄對象裏關聯的屬性,查詢另外一個數據記錄對象裏的屬性
5.數據模版
爲每一個實體生成一個NSManagedObject子類
上面設置數據和獲取數據時,使用的是Key-Value方式,更好的方法是經過生成強類型的NSManagedObject的子類,經過類的成員屬性來訪問和獲取數據
(1)在數據編輯器視圖中選中實體對象,
選則file菜單,點擊new,點擊file...,選擇Core Data項,選擇NSManagedObject subclass,生成該實體同名的類,
繼承於NSManagedObject,生成對應的ContactInfo.h文件和ContactInfo.m文件
@dynamic告訴編譯器不作處理,使編譯經過,其getter和setter方法會在運行時動態建立,由Core Data框架爲此類屬性生成存取方法