关系中的核心数据“删除规则”不会在后端中继?

时间:2015-03-10 15:40:41

标签: core-data

我使用sqlite作为后端的Core Data。似乎当您为实体关系设置'on delete'时,'cascade'核心数据不会使用后端删除。核心数据简单地删除循环中的所有相关数据。当我尝试删除具有大量相对对象的对象时,它给了我额外的延迟。首先,它会完成所有相对故障对象,然后逐个删除它们。我可以从日志中看到它。

我认为如果我使用sqlite作为Core Data的后端,'cascade'删除规则将在sqlite'create table statement'的帮助下完成。

我想念某事吗?是否有可能强制Core Data在sqlite后端使用级联删除?

UPD:

正如@Mundi建议的那样。我已通过以下方式解决了这个问题:

  1. 为实体设置删除规则为“无操作”(称为项目) 它有很多相对的对象(超过10K)
  2. 扩展实体项目 与prop isDeleted。
  3. 而不是删除我将Project.isDeleted设置为1.
  4. 使用谓词isDeleted eq 0过滤所有视图。
  5. 创建一个每10秒运行一次的后台任务(可调)并删除带有prop isDelete eq 1及其相对对象的项目
  6. 后台任务按以下方式删除:

    1. 执行获取(isDeleted = 1)以使用setLimit eq 3(可调参数)删除项目
    2. 执行批处理抓取以获取要删除的所有相关对象。
    3. 删除循环中的所有相对对象+批量大小后保存。如果这里发生了不好的事情,我们可以继续进行另一次运行如果用户想关闭应用程序,我甚至会停止这项任务。
    4. 删除项目并保存。

1 个答案:

答案 0 :(得分:1)

正确,巨大的删除和插入操作可能会对性能造成压力。这些删除是否由删除规则引起并不重要。

最佳解决方案是“手动”自行删除项目。覆盖父管理对象子类中的方法willSave,检查deleted标志并自行删除子项。

如果要删除的记录很多(检查多少),您应该能够通过删除批次的记录(可能一次只有几百个)并保存来消除性能问题每批后。