注:我懷疑我的問題的根本原因是Xcode4是正確更新私人散列它使用而不是版本號來跟蹤數據模型版本。也許我不小心添加了一些東西,然後刪除它,並且它改變了哈希值 - 我的原始模型非常簡單,很容易通過目測進行比較,並且沒有差異。
此外,更廣泛的問題是,Xcode4 仍然不處理CoreData項目正常 - 它創建CoreData模型作爲「版本」在默認情況下(從Xcode3大的改善,這是註定要始終創建沒用型號) ,但它仍然不會任何處理模型中的更改 - 您必須手動記住在保存任何更改之前更新版本(否則所有項目遷移將永遠失敗,永遠無法離開)。
此外,一旦出現問題,我找不到任何「正確的」解決方案 - 蘋果的Core Data lib中缺少太多的部分。基本上:據我所知,NSPersistentDocument是不完整的,不受支持的。
最後,我去下面殘酷的解決方法:指導大家用舊版本手動編輯CoreData商店聲稱他們正在運行當前版本。
這項工作100%,因爲與CoreData不同,我的應用程序被編寫爲智能地更正任何明顯缺少的導入數據。這是微不足道的,但CoreData不允許你說「是的,我已經完成了,沒關係,繼續打開文件!」
- 在舊版本:「保存爲XML」
- 給了他們新的頭複製/粘貼到文件的頂部。注意:蘋果公司使用哈希代替版本號,這使得這看起來很可怕,即使它不是。我不明白爲什麼蘋果會忽略他們自己的版本系統並使用哈希代替?在新版本中
- :打開更新的文件
- 在新的版本: 「保存」
...並且因爲我重寫NSManagedObject方法:
-awakeFromInsert
和固定任何不正確的/缺失的數據時,步驟3和4上面的「自動的」更新數據。
我知道「正確」的方式本來就是創建一個映射模型,但是對於大多數情況來說它是巨大的矯枉過正......而蘋果拒絕首先加載舊數據。所以,核心數據只是拒絕甚至允許我糾正數據 - 即使我的代碼很高興地這樣做。
(所有舊的項目有進口和正確導出 - 沒有問題)
恕我直言:CoreData真的需要蘋果的結束一些重新設計,以解決所有的邊緣情況下,他們沒有想到第一次就。
注:快速警告:確保你不改變裏面任何awakeFromFetch變量CoreData - 蘋果暫時禁用更改跟蹤調用該方法之前(這是一種可笑的 - 它與行爲不兼容的方法所有其他「awakeFrom *」方法)。
蘋果的建議是:內awakeFromFetch,決定你要去改變什麼,然後封裝和使用這樣的:
[自performSelector:@選擇(myAwakeFromFetchFixItemX :) withObject:X afterDelay:0.01] ;
...只是想我會補充說,任何人嘗試這種 - 否則你的進口將工作正常,但你的出口將默默無法包括固定的數據!