2015-10-08 451 views
-2

我在.txt文件中有16000條記錄,並且想要使用核心數據在數據庫中插入所有數據。但是操作性能並不好,花費很多時間將數據從txt文件讀取到數據庫(使用coredata)。iOS CoreData批量/批量插入(sqlite TRANSACTION)

在android中,我使用 SQLite TRANSACTION來實現最佳性能和正常工作。

但是在iOS中找不到方法。

注意:我已經試過以下帖子,但所有提供的參考網址都顯示爲錯誤404

iOS CoreData batch insert?

+0

是否爲所有用戶的靜態數據? – kirander

+0

@kirander:是所有用戶的文件中的靜態數據。任何想法我們如何實現? –

回答

0

由於數據是靜態的,你只需要下載所有的它由核心數據sqlite的文件。你可以閱讀關於here

+0

謝謝,但我也有其他2-3 API從服務器獲取數據,每個API的響應包含2000-2500記錄。那麼我如何使用核心數據進行批量插入? –

+0

這篇文章中也有關於它的內容。閱讀「從Web服務導入數據」部分。 – kirander

2

您希望使用完全獨立的堆棧進行保存(在專用隊列上創建新的持久存儲協調器和受管對象上下文)。這是爲了充分利用iOS7 +中的默認WAL。這使您可以在不阻止正在閱讀的上下文的情況下進行書寫。

您還希望批量導入,每個批次都在自己的自動釋放池中。保存並重置MOC。

我在這個例子中忽略的錯誤,對於具有無關處理錯誤......不要做這樣的例子清晰......

​​

注意,這裏假設你有沒有關係,你只是加載直對象。

如果確實有關係,則應先加載對象,然後再建立關係。

如果您的數據集更像是一堆相關對象的小羣集,那麼您應該將每個小羣集加載爲批處理,加載對象,然後連接關係,然後保存並移至下一批。


那麼,示例代碼是做什麼的?

它創建了一個完全獨立的核心數據堆棧,可以在導入過程中實現更好的併發性。

它以小批量加載對象。這可以防止內存分配失控,並保持更新大小易於管理。如果您有其他上下文觀察更改並自動合併它們,這將有所幫助。小批量對其他正在合併的線程的影響較小。

保存每批後提交數據到商店。重置上下文可釋放與上下文關聯的所有內存,並允許下一批次重新開始。這有助於限制內存增長。

自動釋放池可確保在每批次結束時釋放任何自動釋放的對象,也有助於減少內存佔用。

最後的通知允許您通知其他代碼從實際的核心數據數據庫文件中重新提取。

對於非常大的進口量,這可能比觀察保存上下文的每一次併購更有效。

這顯然是不工作的代碼,但它顯示了你,你應該如何進行。如果你遵循這個模板,你應該能夠快速有效地導入。

0

這可以很容易地,高效地完成以下提示:

  • 導入時,保存在批(例如,每500個記錄,實驗以獲得最佳效果)
  • 使用@autoreleasepool s到優化內存
  • 關閉undoManager(將其設置爲nil
  • 使用兒童方面做插入的背景。請參閱下面的方案以獲取核心數據備份操作的最佳設置。

    rootContext(背景) - 保存到持久性存儲 mainContext(主線程) - 用於UI workerContext(背景) - 執行繁重的工作(如許多插入)

您保存工人上下文中,UI被有效地更新(全部在內存中),而數據創建和保存到物理數據庫的繁重工作則在後臺完成。

這從一個CSV文件中插入200.000+記錄良好地進行。

注意,在模擬器中做的這一切(即使沒有優化),然後把完成的SQLite數據庫文件到其他地方提出的捆綁也是可行的和好的做法。