2015-05-13 132 views
0

我有一些主數據,它們是JSON文件,我需要使用CoreData導入。交易點是所有主人正常插入的時候。但是,在提交之前,內存的使用量正在增加。在提交之前,應用程序因過載內存而崩潰。CoreData導入過載內存

我在想下面的兩個解決方案。

  1. 使用SQLite的功能,如將數據保存到臨時文件。 (我不確定功能是否存在。)

  2. 使用兩個DB文件。一個是手術,另一個是暫時的。如果導入正常完成,則將時間替換爲操作DB。

但仍不確定。有沒有人知道這種情況下的解決方案?謝謝。

UPDATE1:

所以你要導入到一個空的數據存儲,或者要添加到您需要恢復到失敗現有的數據?

在我而言,這是下面的過程。

  1. 刪除現有數據。 (所有表)

  2. 導入到一個空數據。主數據完成

  3. 後,提交。如果發生錯誤,則回滾事務。刪除和導入被恢復,以確保主數據之間的一致性。

而且,爲什麼在移動設備上的數據量?

我的客戶的需求。

UPDATE2:

我試圖禁用的UndoManager但結果並沒有影響那麼大。我不需要「撤消」,但我需要回滾。在這種情況下,setUndoManager可用...?

[[self managedObjectContext] setUndoManager:nil] ; 
+0

所以你要導入到一個空的數據存儲,或者要添加到您需要恢復到失敗現有的數據?另外,爲什麼要在移動設備上做很多數據? – Wain

+0

@Wain感謝您的評論。我編輯了我的問題。首先刪除所有數據,然後導入空數據。 – zono

+0

你有沒有考慮批量進口?然後,您可以將每個批次保存在一個私有MOC中,該批次在完成後可以保留在另一個附加到持久存儲協調器的私有MOC上。 – andrewbuilder

回答

2

CoreData內存不足。

其上下文(暫存區)存儲在內存中。

如果你可以用2個DB文件工作,存儲在一個新的文件新的數據並保存,並定期刷新(如每1000條記錄,這取決於你的記錄的大小),以保持你的內存消耗可以接受的。 如果導入時發生錯誤,只需關閉並刪除新的db文件。

您還可以在初始db文件中添加一個字段到記錄中,該記錄可以是"validated": boolean"timestamp": date。 新記錄的驗證字段爲false。如果遇到錯誤,請刪除所有未經「驗證」的記錄(或在日期,刪除其「時間戳」位於導入開始日期之後的所有記錄)。

但是,在第二種解決方案中,您不需要一次刪除所有記錄,因爲如果您提出請求以獲取其「已驗證」爲false的所有記錄,則所有新記錄都將在暫存區中實例化(這就是方式CoreData的作品),這將再次消耗大量的內存。

+0

謝謝,我從來沒有想過第二種解決方案。我現在正在檢查哪個更適合我的情況。 – zono