我的应用程序中存在这个问题,即从我的数据库中删除大量数据需要很长时间。所以我开始调试,发现变压器是问题所在!了解CoreData中变形的错误
要看到我创建的隔离问题的一个项目...
的问题,我有以下几点:
+-----------+ +-----------+
| Entity A | | Entity B |
+-----------+ +-----------+
| | | property |
| b | 1:1 | a |
+-----------+ +-----------+
所以Entity A
有一个1:1的关系Entity B
。并且Entitiy B
有一个名为property
的属性,它是Transformable并具有ValueTransformer。 A到B的删除规则无效。
现在我创建一个A和B的实例,将它们链接起来并写入属性。保存上下文,一切按预期工作。
现在我想删除Entity A
的所有对象。我创建一个提取请求,并删除所有实体。在我的示例我这样做,像这样:
context.perform {
let fetchRequest = NSFetchRequest<EntityA>(entityName: "EntityA")
guard let allEntities = try? context.fetch(fetchRequest) else { return }
for entity in allEntities {
context.delete(entity)
}
try? context.save()
}
现在时保存情况,值变压器reverseTransformedValue
被调用。我不明白为什么?!?因为我不访问该属性...我没有设置或得到它...
如果有人能为我摆脱一些光,会很酷。
我也有可以在这里找到我的样本项目:https://www.dropbox.com/s/651dmyughosr90p/ValueTransformerIssue-Sample.zip?dl=0
你好,汤姆,很高兴再次读你:) 我想你是对的,那关系的问题就是问题。 在我的真实应用程序(这里不只是这个示例),我已经有一个单独的实体,其中包含价值可转换数据。只是数据而没有别的,因为错误加载了一切。另一个问题是这些数据很大。它是您记录的活动的GPS数据。 我想最好的解决方案是将它们写入一个文件,并且只是从核心数据中引用它们,我猜?!? 我也看了一下'NSBatchUpdateRequest',但是因为我有...... – Georg
......相当一些关系太过痛苦才能得到正确的......我想我只需要找到一种更好的方式来存储我的数据,因为在SQL中有这么多的二进制文件不是一个好主意...... 我会等待更多的接受你的答案,以防万一奇迹发生,有人有一个超级简单的解决方案......但非常感谢你很多为您的详细答案! – Georg
@Tom我认为NSBatchDeleteRequest确实遵守删除规则 - 只是不自定义验证? – pbasdf