Core Data學習(二) 關鍵類分析

ManagedObjectsModal

通常可以使用Xcode的建模工具來創建模型(請參考"Create a managed object with Xcode")。你也可以全部使用代碼來創建(請參考"Core Data Utility Tutorial")。

編譯數據模型

    數據模型是一種部署資源。 在模型中,除了有實體和屬性的詳細信息外,用Xcode創建的模型還包含了一些額外的視圖信息,包括佈局、顏色等等。這些信息在運行時不是必須的。模型文件在編譯的過程中會刪除這些額外信息以保證儘可能高效的加載。xcdatamodel“源”文件會被momc編譯器編譯爲mom的目標文件。

    "mom" 位於 /Library/Application Support/Apple/Developer Tools/Plug-ins/XDCoreDataModel.xdplugin/Contents/Resources/,如果你想把它用在自己的 build腳本中,格式是:mom source destination, source 就是Core Data Model文件,destination就是輸出的mom文件。

加載數據模型

    在一些情況下,你不需要寫任何加載模型的代碼。如果你使用基於文檔的程序框架(Document-based application),NSPersistentDocument會管理諸如查找模型、加載模型的任務。 如果你創建了非Document-based application,而且裏面又用到了Core Data,一般將獲取模型的代碼放在application delegate裏。模型的存儲名稱——也就是文件名,

    和運行時的名稱是不相關的,一旦模型被加載,文件名就沒有什麼意義了。也就是說,對模型文件,你可以隨意命名。

    如果你想手動加載模型,有兩種方式可用,它們各有各的好處:

    你可以從指定的bundle集合裏創建整合模型,使用如下的類方法:
mergeModelFromBundles:

    也可以用指定的URL加載單個的模型,使用如下的實例方法:
initWithContentsOfURL: (這個方法相信大家都用過)

    若不需要考慮分開加載模型,第一個類方法很適用。例如:在你的程序中和程序鏈接的framework裏都有你想要加載的模型。這個類方法可以讓你很輕鬆的加載所有的模型,而不需要考慮模型文件的名稱,也不用特定的初始化方法來保證所有的模型都被找到。

    但是當你有多個模型要加載,特別是這些模型都代表了一個schema的不同版本,這時,知道要加載哪個模型就很重要了(合併包含相同實體的模型可能導致命名衝突和錯誤,我們之前“一鍋端”的方法不太合適了)。在這種情況下,我們可以用第二個實例方法。 另外,有時我們也需要將模型存儲在bundle之外,也需要用這個方法從指定的URL位置加載模型。

    還有一點需要說明:我們還有一個類方法 modelByMergingModels:可以用。像mergedModelFromBundles:方法一樣,它也能合併給定的若干個模型。這樣,我們就可以通過URL來逐一加載模型,然後在創建助理對象之前將它們整合爲一個。

改變模型

    由於模型描述了存儲層數據的結構,任何改變模型的動作都將使其不在適配於之前創建的存儲層。 如果你改變了模型的結構,就需要將當前存儲層的數據遷移到新版本。(請參考"Core Data Model Versioning and Data Migration Programming Guide"文檔)。例如:如果你添加了新的實體,或新的屬性,你將無法打開舊的存儲;如果你添加了驗證的限制,或者爲屬性添加了新的缺省值,你就可以打開舊的存儲。

在運行時訪問和適用被管理對象模型

    在運行時,被管理對象模型就是一個簡單的“對象圖”(這個概念之前提到過),認識到這點很重要,尤其是當你需要用代碼來訪問模型的詳細信息時。例如:修改模型(你只能在runtime之前這樣做,請參考 NSManagedObjectModel),取回信息(如本地化實體名,屬性數據類型,或數據請求模板)。

    在運行時訪問模型有很多方法,通過持久棧最終從持久化存儲助理得到模型,代碼如下:
[[aManagedObjectContext persistentStoreCoordinator]managedObjectModel];

    你也可以通過實體描述得到模型,因此給定一個被管理對象,你就可以得到它的實體描述,進而獲得模型。代碼如下:
[[aManagedObject entity] managedObjectModel];

    某些情況下,你要維護模型的“直接”引用,也就是說,一個直接返回模型的方法。NSPersistentDocument提供了 managedObjectModel方法,可以返回一個模型,該模型和在文檔的上下文中使用的持久化存儲助理相關聯。如果你使用Core Data Appplication的模板,application delegate將負責模型的引用。


ManagedObjectsContext


PersistentCoordinator


發佈了55 篇原創文章 · 獲贊 4 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章