Core Data是iOS編程中使用持久化資料存放區的一種方式。在以前的教程 – 讀寫應用程式的設定資料,我們已經提供了三種方式來實現App資料的儲存,分別為:
(1)使用者預設設定 – 這種情況通常不需要使用者幹預,如遊戲通關資訊,Video播放記錄,或者App退出之後,下次進入時,希望恢複到退出時的情況。
(2)設定束(Settings Bundle)– 提供了一個通過iPhone、iPad的設定(Settings)應用程式進行配置的介面。
(3)直接存取檔案系統 – 讀寫屬於當前App的iOS 檔案系統部分的檔案。
在一些情況下,我們可以考試使用Core Data來持久化資料。需要知道的是,Core Data 並不是資料庫本身,是Apple提供的對象持久化技術(Object Persistent Technology)。Core Data 架構為資料變更管理、Object Storage Service、對象讀取恢複的功能提供了支援。它可以使用SQLite作為持久化儲存的類型,但本身並不是一個資料庫。
教程將重點介紹和示範Core Data架構的使用,並不是建立一個完美的應用程式,而是示範基於Core Data架構建立應用程式的過程中,所需要使用到的一些基礎類、工具和技術。
下面先瞭解Core Data架構提供的一些核心類,在App開發過程中需要使用到。
Core Data 堆棧(Stack)
堆棧(Stock)術語用來表述Core Data架構對象集合,這些對象實現從模型對象中擷取資料,和儲存資料到持久化儲存(Persistent Store)中-也就是資料檔案。從概念上講,一個持久化儲存(Persistent Store)就像一個資料庫,有資料表和資料記錄。我們可選用的Core Data儲存類型之一是SQLite,但是隱藏檔並不一定是實際的資料庫。
是一個簡單的、且常用的Core Data堆棧配置。我們通常直接使用的類是堆棧頂部的Managed Object Context(被管理物件內容)和它所包含的Managed Objects(被管理對象)。
被管理對象和被管理物件內容
被管理對象(Managed Object)是NSManagedObject對象或NSManagedObject子類對象執行個體。其實,也就是資料庫中資料表記錄的對象表示,由 Core Data管理的模型(Model)對象。被管理對象(Managed Object)表示應用程式中操作的資料,例如人力資源應用系統中的部門和員工;畫圖應用程式中的各類形狀、文本等等。一個被管理對象總是和一個被管理對 象上下文(Managed Object Context)相關聯。
被管理物件內容(Managed Object Context)是NSManagedObjectContext對象執行個體。上下文表示應用程式中的一個單一對象空間,它的主要職責管理被管理對象 (Managed Object)集合。這些對象組成了一組關聯的模型對象(Model Object),描繪了一個或多個持久化儲存(Persistent Store)。上下文(Context)是非常強大的對象,在應用程式中起到中心作用,負責生命週期管理到驗證、關係維護(Relationship Maintenance)和撤銷/重做特性。
在我們建立一個新的被管理對象時,將它插入到Context中。從資料庫中擷取的現存記錄也將放到Context中,作為被管理對象。所有對被管理對象(Managed Object)的修改都保留在記憶體中,直到正在提交給持久化儲存儲存上下文(Context)。
描繪了被管理物件內容(Managed Object Context)包含2個被管理對象(Managed Object),對應著資料庫中2條記錄。其中一個對象的屬性值已經在記憶體中更新過了,但還沒有提交到資料庫儲存。另外,還有2條記錄在資料庫中,並沒有 對應的被管理對象(Managed Object)。
被管理物件模型(Managed Object Model)
被管理物件模型是NSManagedObjectModel執行個體。被管理物件模型是資料庫Schema的對象表示,是實體描述對象(Entity Description Object – NSEntityDescription執行個體)的集合。
一個實體描述對象(Entity Description Object)描述了資料庫中一個資料表實體,包括表名稱、表對應的被管理對象的名稱、屬性(Attributes)和關係(Relationships)等等。
描繪了實體描述對象、資料庫中資料表和被管理對象(對應資料庫表的一條記錄)之間的關係。
從可以看出,每一個被管理對象(Managed Object)都有對應實體物件的引用。
Core Data使用模型(Model)來映射應用程式中被管理對象和資料庫中的資料記錄。需要注意的是,如果我們修改資料庫的Schema,Core Data將無法使用之前建立的模型來讀取資料庫記錄了。很多持久化機制都存在這個問題。
我們一起看看下面這些範例程式碼:
Customer *customer1 = (Customer *)[NSEntityDescription insertNewObjectForEntityForName:@"Customer"
inManagedObjectContext:self.managedObjectContext];
customer1.customerID = [NSNumber numberWithInt:1];
customer1.customerName = @"EntLib.com";
customer1.password = @"EntLib.com";
customer1.userName = @"EntLib.com";
Customer 類是NSManagedObject子類,NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:方法建立customer1 被管理實體物件,並和被管理物件內容(Managed Object Context)self.managedObjectContext相關聯。
持久化儲存協調器(Persistent Store Coordinator)
持久化儲存協調器(Persistent Store Coordinator)在Core Data管理資料過程中扮演重要的角色,然而,在使用Core Data架構時,我們通常不必直接和協調器互動。這裡我們詳細介紹持久化儲存協調器,如果你對此沒有興趣,可以跳過去。
持久化儲存協調器是NSPersistentStoreCoordinator執行個體,管理持久化Object Storage Service(Persistent Object Store)集合。一個持久化Object Storage Service表示一個外部隱藏檔。
描繪了協調器扮演的作用。不過,一般iOS 應用程式中,我們通常使用單一儲存(也就是一個資料庫檔案),因此Core Data堆棧並不會像這麼複雜。
下面一段代碼涉及到持久化儲存協調器(Persistent Store Coordinator)的應用,建立持久化儲存協調器(Persistent Store Coordinator)對象執行個體,並設定被管理物件內容(Managed Object Context)的持久化儲存協調器(Persistent Store Coordinator)。
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask] lastObject];
NSURL *storeDatabaseURL = [url URLByAppendingPathComponent:@"ShoppingCart Database"];
// url is now <Document Directory>/ShoppingCart Database
NSError *error = nil;
NSPersistentStoreCoordinator *persistentStoreCoordinator =
[[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeDatabaseURL options:nil error:&error])
{
NSLog(@"Error while loading persistent store ...%@", error);
}
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:persistentStoreCoordinator];
要想對上面描述的Core Data類有比較深入的瞭解,還是必須要結合實際的範常式序來體會。
Core Data 持久化資料存放區 --系列文章:
Core Data持久化資料存放區(2)-使用Core Data實現簡單ShoppingCart應用程式
Core Data持久化資料存放區(3)-編寫Core Data代碼
Core Data持久化資料存放區(4)-運行ShoppingCart應用程式