我試圖在應用程序的核心數據中設置一些輕量級遷移測試,但遇到了一些奇怪的問題。將核心數據輕量級遷移到添加了新屬性的版本後,該屬性爲零
在我的應用程序的版本2和版本3模型之間,我剛剛添加了一個新的integer32屬性。該屬性的默認設置爲0(默認情況下,Xcode創建每當您創建一個新的屬性。我試着測試這個問題與新的屬性設置爲可選或不,它沒有任何區別。使用Xcode的自動生成我的NSManagedObject子類,包含我已經添加了新的屬性。
我使用UIManagedDocument加載我的核心數據文件,並設置它執行自動遷移
NSDictionary *docOptions = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES
};
self.document.persistentStoreOptions = docOptions;
我將當前文檔設置爲版本2的一組實時數據,然後將該應用更改爲版本3.我運行它並且文檔成功打開,因此我認爲遷移已正確運行。當它失敗時,不知道如何從中獲得任何錯誤,我的日誌中沒有任何錯誤。
有一次,我嘗試實際訪問我的NSManagedObject子類的新屬性的NSNumber的財產,我增加我只是發現,屬性是零的CoreData實體的實例,而不是默認的一個NSNumber 0
所有我可以在這裏找到的教程,文檔和問題似乎並不是說我必須做其他任何事情才能實現這一目標。
如果我乾淨地使用版本3模型並使用該版本創建新實體,那麼正如您所期望的那樣,新屬性不是零,因此一切正常。它只是遷移到這個新版本,它似乎沒有適當地在現有的實體實例內創建新的屬性。
任何人的幫助將不勝感激!乾杯。
非常感謝這個答案。實際上,我終於在一天左右的時間裏發現了類似的發現,但之後一直未能上網。 我已經將這個新屬性添加到2個實體中,當我測試它是否可選時,我在代碼中尚未使用的1實體上這樣做。 所以是的,正如你所解釋的那樣,它是可選的,當然總的來說它是零。將其更改爲不可選,並重新遷移一切都非常好,新值設置爲默認值,如您所期望的那樣。 – jimbobuk
我很高興我花了時間處理JSON導入/導出我的核心數據實體。這使得在覈心數據模型版本之間跳轉並重復執行遷移變得相對簡單。無法想象沒有這麼容易的測試,當你試着回滾一個版本時,很容易讓你的模型不想加載。 – jimbobuk