2015-10-08 259 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数据库文件到其他地方提出的捆绑也是可行的和好的做法。