我使用 sqlite 作为核心数据作为后端。似乎当您将实体关系的"删除时"设置为"级联"时,核心数据不会使用后端进行删除。核心数据简单删除一个周期中的所有相对数据。当我尝试删除具有大量相对对象的对象时,它会给我额外的延迟。首先,它满足所有相对的错误对象,然后逐个删除它们。我可以从日志中看到它。
我认为如果我使用 sqlite 作为核心数据的后端,"级联"删除规则将在 sqlite "创建表语句"的帮助下完成。
我想念吗?是否有可能强制核心数据在 sqlite 后端上使用级联删除?
上级:
正如@Mundi所建议的那样。我通过以下方式解决了它:
- 将实体的删除规则设置为"无操作"(称为项目)它有很多相对对象(超过 10K)
- 扩展实体项目与道具被删除。
- 我没有删除,而是将Project.isDelete设置为1。
- 所有视图都使用谓词 isDelete eq 0 进行过滤。
- 创建一个每 10 秒运行一次的后台任务(可调),并删除带有 prop is 的项目删除等式 1 及其相关对象
后台任务通过以下方式删除:
- Exec fetch (isDelete = 1) 使用 setLimit eq 3 获取要删除的项目(可调)
- Exec 批处理获取以获取要删除的所有相关对象。
- 删除一个周期中的所有相对对象 + 批量大小后保存。如果这里发生不好的事情,我们可以继续另一次运行。在这里,如果用户想要关闭应用程序,我什至会停止任务。
- 删除项目并保存。
正确、大量的删除和插入操作可能会对性能造成压力。这些删除是否由删除规则引起并不重要。
最好的解决方案是自己"手动"删除项目。重写父托管对象子类中willSave
的方法,检查 deleted
标志并自行删除子项。
如果要删除的记录很多(检查有多少条),您应该能够通过删除一批记录(一次可能几百条)并在每批后保存来摆脱性能问题。