【问题标题】:Replacing a Core Data property by a new one avoiding Zombie objects用新属性替换核心数据属性,避免僵尸对象
【发布时间】:2013-08-29 13:36:35
【问题描述】:

我有两个名为 Event 和 Image 的 NSManagedObject。 Event 类有一个名为 images 的属性(也具有反向关系),它由一个包含 Image 类对象的 NSSet 组成。

从服务器更新事件时,我只想用新的 Image NSSet 替换旧的 Image NSSet,它也可以包含以前存在的 Image 对象或新的对象。然后我做的是这样的:

event.images = [NSSet setWithArray:imagesParser_.imagesArray];

这实现了我的目的,但我担心仍然属于旧 NSSet 的一些 Image 对象,现在没有任何指向任何事件的链接,可能会永远保留在数据库中。我认为可能在更新后进行清理(在数据库中查找没有事件的图像对象并将它们从数据库中删除)可以解决此问题,但我不知道它的效率如何。

非常感谢。

【问题讨论】:

  • 如果您在核心数据编辑器中创建所需的关系,您可以确保尝试创建孤立实体会导致错误。

标签: iphone ios core-data nsmanagedobject nsset


【解决方案1】:

使用 coredata 删除对象非常快。我会亲自检查并删除所有附加到我的事件的对象,然后添加新的对象。

您也可以采取您的方法,在没有任何事件的情况下不频繁地检查并删除所有图像。仅当将来图像可以在没有事件的情况下存在(例如,您创建了一种需要照片的新型数据)时,这才会成为问题。这真的不是时间或内存密集型的。

保持数据库清洁是个好主意,否则将来可能会遇到麻烦。您现在投入的任何努力通常都会使您在未来受益。如果您不再需要某个对象,请以某种方式将其删除。

【讨论】:

  • 谢谢菲罗。我看到删除所有对象然后添加新对象的唯一问题是一些旧图像仍然可能是新 NSSet 的一部分。删除图像然后用相同的 ID 创建它会不会浪费时间?
  • 您可以将谓词与获取请求相关联,该请求将仅获取事件关系为零的图像对象。
  • 从技术上讲,在您提供的解决方案中,您没有重用任何图像(除非 _imagesArray 手动处理),因为 coredata 在比较实体时不使用属性(或至少是您提供的属性) .因此,与您的解决方案相比,不,您可能不会注意到任何区别。您可以尝试一些方法来改变这一点并使其更有效,但这需要一些额外的实施。
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多