[ SWIFT ] - Core Data屬性修改

如果你的App有使用到Core Data,基本上是不允許對Entity進行修改的,只要有異動,App在執行時一定會爆出錯誤訊息!!

可是偏偏App有很高的機會,會需要新增新的屬性或是再真的不得已的情況下更新屬性的資料類型,要如何處理呢?大部分的解決方法勢將原有的db刪除,以下將介紹不需刪除db的方式,步驟很簡單:

輕量級遷移介紹:
當我們僅僅是對數據模型增加實體或者可選屬性時,上述步驟完成後運行代碼進行遷移是奏效的。這個過程文檔中叫做 Lightweight Migration,當我們進行輕量級遷移時,NSPersistentStoreCoordinator 會為我們自動推斷出一個Mapping Model。如果有更加複雜的改變,我們就需要自己去實現Mapping Mode。

添加Mapping Model過程: New File->CoreData->Mapping Model, 選擇我們需要進行Mapping的兩個Model,最終會生成一個 *xcmappingmodel* 文件,大家可以打開文件,看到裡面生成了Model之間的映射。
官方文檔中介紹如下的改變支持輕量級遷移:
為Entity簡單的添加一個屬性
為Entity移除一個屬性
屬性值由 Optional Non-optional 之間轉換
為屬性設置 Default Value
重命名Entity或者Attribute
增加一個新的relationship 或者刪除一個已經存在的 relationship
重命名relationship
改變relationship to-one to-many 等
增加,刪除Entities
增加新的 Parent 或者 Child Entity
從Hierarchy中移除Entities

※輕量級遷移不支持合併Entity的層級:比如在舊的Model中兩個已知的Entities沒有共享一個共同的Parent Entity,那麼在新的Model中它們也不能夠共享一個共同的Parent Entity。

※建議將新的Mapping Model命名為V2toV1之類的名稱,可以清楚知道版本的變化過程,另外當有多個Mapping Model時,也可以很方便的進行升級的設計,例如使用者的App很就沒更新了,就可以依序由V2toV1先執行,再執行下一個v3tov2來完成完整的升級。

更新流程:
Step1:
新增Model,點選Editor\Add Model Version...新增一個新版本

進行新Model的命名
例如:Customer 中只有name欄位
 新的v2中新增phone欄位

Step2:
設定目前的model設定新的Model為目前的model,點選yourModel.xcdatamodeld,到右側選單中把Model Version的current改為你的新版本,改好你會看到yourModel.xcdatamodeld下面的新版本上有一個小綠勾。

Step3:
修改AppDelegate.swift,將lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator 中
原程式:
try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
修改後:           
let moption = [NSMigratePersistentStoresAutomaticallyOption: true,NSInferMappingModelAutomaticallyOption: true]

            try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: moption)

留言

熱門文章