248
技術社區[雲棲]
Core Data淺談係列之一 : 基礎結構
Core Data是蘋果官方提供的一套框架,用來解決與對象生命周期管理、對象關係圖管理和持久化等方麵相關的問題。大多數情況下,我們引入Core Data作為持久化數據的解決方案,並利用它將持久化數據映射為內存對象。
為什麼要使用Core Data呢?以下幾點可供參考:
- 有豐富且良好的文檔,方便新手入門、老手埋坑。這些文檔多半來源於Apple官方,以及Stackoverflow。
- 有著經過很多開發者檢驗的代碼,除了省去我們編碼的精力,還有著比我們自己編碼更好的代碼質量。
- 蘋果出品使得它與OS X或iOS開發工具鏈密切結合,我們可以在Xcode上進行表的設計,或者在Instruments上進行性能檢測,並且在編碼過程中能夠很自然地維持著Cocoa開發風格。
- 本身所具有的特性,比如支持多類型外部存儲、撤銷/重做、KVC、複雜查詢和對象映射、自動驗證、並發/合並策略、數據遷移、內存策略。除此之外,還與UI展現良好結合。
需要說明的是,Core Data並不是一款關係數據庫,它擁有但不限於關係數據庫的功能,比如它還具有模型設計器、數據訪問層的功能。
針對上麵提到的Core Data所具有的功能,來了解一下它的基本結構。
當我們使用Core Data作為持久化解決方案時,自上而下可以分為如下幾層(稱為Core Data Stack):
Managed Object Context
|
Persistent Store Coordinator —— Managed Object Model
|
Persistent Object Store
在將用戶數據存儲到外部文件前,我們需要考慮以什麼樣的格式進行存儲,所以需要先進行數據表的設計 —— 設計好的數據模型會以Managed Object Model的形式存在於內存中。采用麵向對象的思想進行表的設計時,每一張表描述著一種實體(NSEntityDescription),一份NSManagedObjectModel則包含著多種NSEntityDescription。
比如,我們可以創建一份新的工程,叫cdNBA,用來記錄NBA球員信息。在實際工作之前,我們需要先設計數據模型。新建一份Data Model,如下圖:

將這份Data Model命名為cdNBA,與工程同名,這份數據模型在後麵會以NSManagedObjectModel實例的形式存在於內存中。然後再新建Player和Team兩種實體,如下圖:

從上圖可以看出,一份NSManagedObjectModel,如cdNBA.xcdatamodel,可以包含多份NSEntityDescription,如Player、Team,而每一份NSEntityDescription有三種屬性,分別是Attributes、Relationships和Fetched Properties。
完成了邏輯上的設計之後,我們可以根據NSEntityDescription在內存中創建對象,或者將相應的內存數據存儲到外部文件中(嚴格地講,這裏不一定是外部存儲文件)。
根據NSEntityDescription創建出來的對象比較特殊,我們稱之為NSManagedObject。由於它的特殊性,當我們要創建一個NSManagedObject對象時,比如Player實例,我們需要為其提供一個生存環境,稱之為NSManagedObjectContext。采用龍書的譯法,我將其稱為NSManagedObject的上下文。我個人覺得這種說法挺合適的,因為NSManagedObjectContext記錄著存在於其中的NSManagedObject的生命周期、變化狀態等。
一份NSManagedObjectContext實例作為NSManagedObject在內存中的緩存地帶,我們可以從外部存儲文件中讀取或者臨時創建一批NSManagedObject對象到其中,然後在context中做CURD操作。不論是從本地讀取數據,或者是將數據存儲到本地文件中,都需要經過context的把關。
當我們要將內存中的數據根據NSManagedObjectModel進行持久化時,我們需要一個新的角色來做中間層:NSPersistentStoreCoordinator類。它位於context和存儲文件之間,與NSManagedObjectModel結合,來為context服務,負責將context中的對象信息存儲下來,或者將存儲文件中的數據讀取到context中。
最後就是存儲文件NSPersistentStore了,可以是SQLite、二進製或者XML文件格式等。
Brief Talk About Core Data Series, Part 1 : Basic Structure
Weibo : https://weibo.com/jasonmblog
最後更新:2017-04-04 07:03:41