Core Data

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框架爲此類屬性生成存取方法

相關文章
相關標籤/搜索