我在猜測,除了將數據拉出blob之外,還有一些更改需要進行。我的建議是在幾個階段進行遷移。我在這裏大聲思考,所以有可能改善這一點。這需要你使用SQLite。
爲了使這項工作,你將有你的模型的三個版本:
- 的原始模型
- 去除(並且可能與一種特殊的唯一的ID added--屬性模型見下文)
- 所有的替代屬性
之所以這樣做,你所做的更改,包括增加新的實體和關係模型是,TRA從版本1到版本2的應用程序應該可以通過自動輕量級遷移來實現。在這種情況下,核心數據不需要將任何內容加載到內存中 - 它只是發出SQL語句直接在數據庫上進行更改。
因此,您首先使用舊型號版本設置持久性存儲協調器。加載數據後,查看所有要遷移的對象,提取二進制屬性並以某種方式將其寫入磁盤。您可以使用帶批處理和定期自動釋放池排空功能的提取請求,以確保不會爲臨時對象佔用太多內存。將數據存儲到您使用NSCachesDirectory獲取的目錄中。您顯然希望以一種可以將其與對象的managedObjectID關聯的方式存儲數據。
然後,關閉所有內容並要求Core Data將商店從版本1遷移到版本2.有關詳細信息,請參閱this link。使用版本2打開商店。
您可能需要添加一個步驟,爲每個對象分配某種唯一ID,因爲我不確定Core Data是否在維護非輕量級時維護對象ID移民。如果您需要這樣做,那麼您的版本2模型會爲您將二進制數據從中取出的對象添加一個新屬性,該屬性可以是可選的或者具有默認值集。由於輕量級遷移不應該更改managedObjectID,因此您可以將新唯一ID映射到您在兩段之前與二進制數據一起保存的managedObjectID。
保存數據並關閉商店。
打開商店並從版本2遷移到版本3,這基本上應該是您在發佈問題之前已經編寫的代碼。商店打開後,添加您從版本1商店中保存的所有對象,並使用您保存的數據設置關係。
很簡單吧?
謝謝雅克,實際上這給了我一個很好的提示,我做了類似的事情,沒有像SQLite那麼低。但是我爲自己創建了兩個不同的商店並在其中創建了對象。棘手的部分是確保Core Data儘快將對象轉換爲故障。 – Kamchatka 2011-01-14 06:40:03