2017-09-15 21 views
2

我的应用程序中存在这个问题,即从我的数据库中删除大量数据需要很长时间。所以我开始调试,发现变压器是问题所在!了解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

回答

2

这是一个有趣和有些出人意料的结果,但我认为这是核心数据运行正常。关于核心数据的一些背景细节:

  • 当读取对象时,通常是“故障”。除非您将提取请求配置为需要加载,否则属性值不会立即加载。
  • 当故障对象“发生火灾”时,全部属性值被加载。这会在您访问任何属性值时自动发生,因此如果查找一个属性,则会加载所有属性值。
  • 为了更改属性上的值,Core Data将加载属性值。

你的情况,这似乎要发生的事情是:

  • 你取的EntityA实例。
  • 您可以删除这些实例。
  • 由于您使用“无效”作为删除规则,因此删除EntityA意味着核心数据需要修改相应的EntityB,方法是将其值设置为a为零。
  • 内部核心数据需要加载EntityB实例。由于它正在修改其中一个属性,它首先加载所有属性。此时您的值转换器即使在这里并不真正需要。

如果你的价值变压器损害性能,有些东西你可以尝试修复包括:

  • 移动这个属性到的相关人士EntityB一个独立的实体。当属性错误发生时,关系错误不会触发,所以无效规则不会载入这个新实体的实例。
  • 尽管NSBatchDeleteRequest不符合删除规则(因此“不应用”“无效”),但您可能可以将其与NSBatchUpdateRequest合并以修复关系。类似的,对EntityA实例进行批量删除,然后进行批量更新,以将关系设置为无影响的EntityB实例。

或者当然,也许你的价值变压器可以优化,使它不是一个问题?

希望这会有所帮助。祝你好运!

+0

你好,汤姆,很高兴再次读你:) 我想你是对的,那关系的问题就是问题。 在我的真实应用程序(这里不只是这个示例),我已经有一个单独的实体,其中包含价值可转换数据。只是数据而没有别的,因为错误加载了一切。另一个问题是这些数据很大。它是您记录的活动的GPS数据。 我想最好的解决方案是将它们写入一个文件,并且只是从核心数据中引用它们,我猜?!? 我也看了一下'NSBatchUpdateRequest',但是因为我有...... – Georg

+0

......相当一些关系太过痛苦才能得到正确的......我想我只需要找到一种更好的方式来存储我的数据,因为在SQL中有这么多的二进制文件不是一个好主意...... 我会等待更多的接受你的答案,以防万一奇迹发生,有人有一个超级简单的解决方案......但非常感谢你很多为您的详细答案! – Georg

+0

@Tom我认为NSBatchDeleteRequest确实遵守删除规则 - 只是不自定义验证? – pbasdf