【问题标题】:CoreData import overload memoryCoreData 导入重载内存
【发布时间】:2015-05-13 06:47:37
【问题描述】:

我有一些主数据,它们是 JSON 文件,我需要使用 CoreData 导入。事务点是所有master正常插入的时候。但是,在提交之前,内存的使用量正在增加。由于提交前内存过载导致应用崩溃。

我正在考虑以下两种解决方案。

  1. 使用 SQLite 的功能,例如将数据临时保存到文件。 (我不确定该函数是否存在。)

  2. 使用两个 DB 文件。一个是用于操作的,另一个是临时的。如果导入正常,则从临时数据库替换为操作数据库。

但仍然不确定。有谁知道这种情况下的任何解决方案?谢谢。

更新1:

因此,您是要导入一个空的数据存储,还是要向现有数据添加失败时需要恢复的数据?

就我而言,这是下面的过程。

  1. 删除现有数据。 (所有表格)

  2. 导入空数据。

  3. 主数据完成后,提交。如果发生错误,回滚事务。删除和导入还原,保证主数据的一致性。

另外,为什么要在移动设备上存储大量数据?

我客户的需求。

更新2:

我尝试禁用 undoManager,但结果并没有太大影响。我不需要“撤消”,但我需要回滚。在这种情况下,setUndoManager 可用...?

[[self managedObjectContext] setUndoManager:nil] ;

【问题讨论】:

  • 所以您是要导入一个空的数据存储,还是要添加到需要在失败时恢复的现有数据?另外,为什么要在移动设备上存储大量数据?
  • @Wain 感谢您的评论。我编辑了我的问题。首先删除所有数据,然后导入到空数据中。
  • 您是否考虑过批量导入?然后,您可以将每个批次保存在一个私有 MOC 中,完成后可以将其保存到另一个私有 MOC 上,该 MOC 连接到持久存储协调器。
  • @andrewbuilder 谢谢。我不知道。你能分享我更多的细节或参考网址吗?我想详细说明一下。
  • 如果我记错了(当我使用 CoreData 时),UndoManager 实际上在 iOS 上是默认禁用的。

标签: ios sqlite swift core-data


【解决方案1】:

CoreData 需要大量内存。

它的上下文(暂存器)存储在内存中。

如果您可以使用 2 个 db 文件,请将新数据存储在一个新文件中并定期保存和刷新(例如每 1000 条记录,具体取决于您的记录大小),以保持您的内存消耗可接受。 如果导入时出现错误,只需关闭并删除新的 db 文件即可。

您还可以通过在记录中添加一个字段来处理初始 db 文件,该字段可以是 "validated": boolean"timestamp": date。 新记录的验证归档为假。如果遇到错误,请删除所有未“验证”的记录(或在日期,删除“时间戳”在导入开始日期之后的所有记录)。

但是,在第二种解决方案中,您不需要一次删除所有记录,因为如果您请求获取“已验证”为假的所有记录,则所有新记录都将在暂存器中实例化(就是这样CoreData 有效),这将再次消耗大量内存。

【讨论】:

  • 谢谢,我从没想过第二种解决方案。我现在正在检查哪种情况更适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2011-11-16
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多