我有一些主数据,它们是JSON文件,我需要使用CoreData导入。交易点是所有主人正常插入的时间。但是,在提交之前,内存的使用量会增加。由于提交前的过载内存,应用程序崩溃。
我正在考虑以下两种解决方案。
使用SQLite的功能,例如将数据保存到临时文件。 (我不确定该功能是否存在。)
使用两个DB文件。一个是操作,另一个是暂时的。如果导入正常完成,则从time替换为操作DB。
但仍不确定。在这种情况下有谁知道任何解决方案?感谢。
UPDATE1:
您是要导入空数据存储,还是要添加到失败时需要恢复的现有数据?
就我而言,这是下面的过程。
删除现有数据。 (所有表格)
导入空数据。
完成主数据后,提交它。如果发生错误,则回滚事务。删除和导入将被恢复,以确保主数据之间的一致性。
另外,为什么移动设备上有大量数据?
我的客户需要。
UPDATE2:
我尝试过禁用undoManager但结果并没有那么多。我不需要“撤消”但我需要回滚。在这种情况下,setUndoManager可用......?
[[self managedObjectContext] setUndoManager:nil] ;
答案 0 :(得分:2)
CoreData需要大量内存。
它的上下文(暂存器)存储在内存中。
如果您可以使用2个db文件,请将新数据存储在新文件中并定期保存和刷新(例如,每1000条记录,具体取决于您的记录大小),以保持您的内存消耗可接受。 如果导入时出错,只需关闭并删除新的db文件。
您还可以处理初始数据库文件,并在记录中添加一个字段,该字段可以是"validated": boolean
或"timestamp": date
。
新记录的验证归档为假。如果遇到错误,请删除所有未经“验证”的记录(或在日期中删除“时间戳”在导入开始日期之后的所有记录。)
但是,在第二个解决方案中,您不需要一次删除所有记录,因为如果您发出请求以获取“validated”为false的所有记录,则所有新记录都将在暂存器中实例化(这就是方式CoreData工作),这将再次消耗大量内存。