8

我正在兩個版本的應用程序之間遷移CoreData模型。我在之前的版本中將二進制數據存儲爲blob,並且我想將它們從blob中取出以獲得性能。我的問題是,在遷移期間,Core Data似乎將所有內容加載到內存中,導致低內存警告,然後導致我的應用程序被終止。執行核心數據遷移時的內存不足

蘋果文檔建議如下: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmCustomizingTheProcess.html#//apple_ref/doc/uid/TP40005510-SW9

然而,似乎依賴於一個事實,即大的物體應用不同的映射。 在我的情況下,所有的對象基本上都是相同的,並且必須將相同的映射應用於它們中的每一個。在這種情況下,我看不出如何運用他們的技術。

我應該如何處理非常大的對象的遷移?

回答

2

我在猜測,除了將數據拉出blob之外,還有一些更改需要進行。我的建議是在幾個階段進行遷移。我在這裏大聲思考,所以有可能改善這一點。這需要你使用SQLite。

爲了使這項工作,你將有你的模型的三個版本:

  1. 的原始模型
  2. 去除(並且可能與一種特殊的唯一的ID added--屬性模型見下文)
  3. 所有的替代屬性

之所以這樣做,你所做的更改,包括增加新的實體和關係模型是,TRA從版本1到版本2的應用程序應該可以通過自動輕量級遷移來實現。在這種情況下,核心數據不需要將任何內容加載到內存中 - 它只是發出SQL語句直接在數據庫上進行更改。

因此,您首先使用舊型號版本設置持久性存儲協調器。加載數據後,查看所有要遷移的對象,提取二進制屬性並以某種方式將其寫入磁盤。您可以使用帶批處理和定期自動釋放池排空功能的提取請求,以確保不會爲臨時對象佔用太多內存。將數據存儲到您使用NSCachesDirectory獲取的目錄中。您顯然希望以一種可以將其與對象的managedObjectID關聯的方式存儲數據。

然後,關閉所有內容並要求Core Data將商店從版本1遷移到版本2.有關詳細信息,請參閱this link。使用版本2打開商店。

您可能需要添加一個步驟,爲每個對象分配某種唯一ID,因爲我不確定Core Data是否在維護非輕量級時維護對象ID移民。如果您需要這樣做,那麼您的版本2模型會爲您將二進制數據從中取出的對象添加一個新屬性,該屬性可以是可選的或者具有默認值集。由於輕量級遷移不應該更改managedObjectID,因此您可以將新唯一ID映射到您在兩段之前與二進制數據一起保存的managedObjectID。

保存數據並關閉商店。

打開商店並從版本2遷移到版本3,這基本上應該是您在發佈問題之前已經編寫的代碼。商店打開後,添加您從版本1商店中保存的所有對象,並使用您保存的數據設置關係。

很簡單吧?

+0

謝謝雅克,實際上這給了我一個很好的提示,我做了類似的事情,沒有像SQLite那麼低。但是我爲自己創建了兩個不同的商店並在其中創建了對象。棘手的部分是確保Core Data儘快將對象轉換爲故障。 – Kamchatka 2011-01-14 06:40:03