Core Data是一套用來解決對象生命周期管理、對象關系圖管理以及持久化方面問題的架構,
在大多數情況下我們使用Core Date做為持久化資料的解決方案,它提供了對象-關系映射(ORM)的功能,利用它可以将OC對象轉化為資料儲存在SQLite中,同時也能夠将儲存的資料還原成OC對象
用圖像描述如下:
左邊是關系模型,右邊是對象模型,利用Core Data可以很容易的完成兩者的互相轉化
Core Data持久化最終存儲的資料檔案類型可以使SQLite資料庫、XML檔案、二進制檔案、以及記憶體中
當我們使用Core Data作為持久化解決方案時,自上而下可以分為如下幾層(稱為Core Data Stack):
Core Data Stack有下列對象組成:一個或者多個管理上下文對象(NSManagedObjectContext),一個持久化存儲協調器(NSPersistentStoreCoordinator)以及存儲協調器連接配接的一個或者多個資料存儲(Persistent Object Store),圖形表示如下:
Core Data的核心對象
1、NSManagedObjectContext
被管理資料的上下文對象,負責應用與資料庫之間的互動,對資料進行增、删、改、查(CURD),通過它可以對NSManagedObject進行增、删、改、查等操作,在沒有對其存儲到外部檔案之前,所有的操作都會在NSManagedObjectContext對象中存儲,如下圖:
2、NSManagedObjectModel
被管理的資料模型、資料結構,包含各實體資訊的定義以及各實體之間的關系,可以了解為資料庫表結構的對象表現形式
NSManagedObjectModel對象是NSEntityDescription執行個體對象的集合,一個EntityDescription Object描述了資料庫中一個資料表實體,包括表名稱、表對應的NSManagedObject對象的名稱、屬性(Attributes)和關系(Relationships)等。
3、NSPersistentStoreCoordinator
持久化存儲協調器,用來管理Persistent Object Store對象的集合(設定資料存儲的名字、位置、存儲方式、存儲時機),
每個PersistentObject Store對應一個外部存儲檔案(Persistent Store),
如下圖所示,描述了PersistentStore Coordinator在Core Data 架構中的作用
4、NSManagedObject
被管理的資料記錄,一個NSManagedObject對象對應着表中的一條記錄,下圖展示了NSManagedObject對象與資料庫表記錄直接的關系:
5、NSFetchRequest
資料請求,相當于查詢語句,通過類NSEntityDescription來描述實體對象,類NSPredicate提供過濾條件,類NSSortDescriptor對查詢結果做排序等
如下圖所示,描述了一條記錄是如何通過NSManagedObjectContext查詢出來的。
6、NSEntityDescription
表實體結構,用來描述實體
備注:.xcdatamodel檔案編譯後為.momd或者.mom檔案
使用Core Data進行資料存儲的整個流程如下:在進行資料存儲之前我們需要考慮以什麼格式對資料進行存儲,是以需要先進行資料表的設計
設計好的資料模型會以Managed Object Model的形式存在于記憶體中。采用面向對象的思想進行表的設計時,
每一張表描述着一種實體(NSEntityDescription),一份NSManagedObjectModel則包含着多種NSEntityDescription。
我們可以根據NSEntityDescription在記憶體中建立對象,或者将相應的記憶體資料存儲到外部檔案中(嚴格地講,這裡不一定是外部存儲檔案)。
根據NSEntityDescription建立出來的對象比較特殊,我們稱之為NSManagedObject。由于它的特殊性,當我們要建立一個NSManagedObject對象時,
我們需要為其提供一個生存環境,稱之為NSManagedObjectContext。我們将其稱為NSManagedObject的上下文。我個人覺得這種說法挺合适的,
因為NSManagedObjectContext記錄着存在于其中的NSManagedObject的生命周期、變化狀态等。
一份NSManagedObjectContext執行個體作為NSManagedObject在記憶體中的緩存地帶,我們可以從外部存儲檔案中讀取或者臨時建立一批NSManagedObject對象到其中,
然後在context中做CURD操作。不論是從本地讀取資料,或者是将資料存儲到本地檔案中,都需要經過context的把關。
當我們要将記憶體中的資料根據NSManagedObjectModel進行持久化時,我們需要一個新的角色來做中間層:NSPersistentStoreCoordinator類。它位于context和存儲檔案之間,與NSManagedObjectModel結合,來為context服務,負責将context中的對象資訊存儲下來,或者将存儲檔案中的資料讀取到context中。
最後就是存儲檔案NSPersistentStore了,可以是SQLite、二進制或者XML檔案格式等。