ios - CoreData导入重载内存

标签 ios sqlite swift core-data

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

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

  1. 使用SQLite的功能,如将数据保存到临时文件。 (不知道有没有这个功能。)

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

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

更新 1:

So you're importing into an empty data store, or you're adding to existing data that you need to revert to on failure?

在我的例子中,这是下面的过程。

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

  2. 正在导入一个空数据。

  3. 主数据完成后,提交。如果发生错误,回滚事务。删除导入回溯,确保主数据之间的一致性。

Also, why do much data on a mobile device?

我客户的需求。

更新2:

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

[[self managedObjectContext] setUndoManager:nil] ;

最佳答案

CoreData 非常耗内存。

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

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

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

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

关于ios - CoreData导入重载内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30207541/

相关文章:

ios - 在导航 Controller 类的类别中添加左右栏按钮项

ios - 转换 [字符串 : Any] to [String: String] in swift

objective-c - iOS 如何处理数据库更新所需的时间

swift - 调用touchesEnded时移除 View

iphone - iOS 上的用户体验流程

iphone - Sharekit - 架构 i386 的 ndefine 符号 :

mysql - 什么是 SELECT col1 FROM table WHERE col2=somestring 的 Django ORM 等价物?

android - ORMLite 搜索具有最常见列的行

ios - Mapbox - setCenterCoordinate 正在取消选择注释

ios - 仅当用户滚动时才将数据拉入 CollectionView 中?