孤立核心数据对象未被破坏

时间:2014-03-04 12:46:52

标签: objective-c cocoa-touch cocoa core-data

我在Core Data中有一个Recipe对象,可以容纳Photo个对象。后者包含图像的NSData属性和一些实用程序属性。

当我更改Photo的{​​{1}}时,我遇到了不便:

Recipe

如果recipe.photo = [Photo insertIntoContext: ctxt]; recipe.photo,则一切正常。但是,如果它有一个先前的nil实例,那个变为“垃圾”,具有Photo配方属性(照片的反向关系)并在保存时导致异常(配方不是可选的)我的模特)。

因此,我最终不得不这样做:

nil

这看起来非常像手动内存管理,我必须确保正确删除“孤立”if(!recipe.photo){ [ctxt deleteObject:recipe.photo); } recipe.photo = [Photo insertIntoContext: ctxt];

必须有更好的方法。我做错了什么?

2 个答案:

答案 0 :(得分:3)

您的解决方案有效且您的方法正确无误。核心数据不会自动删除悬空的孩子。您需要明确删除它。然而,“where”受到质疑。

如果您真的总是想在添加这样的新子项之前删除现有子项,那么我将在set访问器中的父对象的子类中处理它。这将允许您在执行删除之前检查是否相等。这也将从您的(可能)视图控制器中删除此维护工作。

更新

  好的,谢谢。所以我应该使用setPrimitiveValue&创建一个自定义setter。朋友?

正确。您还需要使用KVO方法(-willChangeValueForKey:-didChangeValueForKey:),以便您的访问者做正确的事。

答案 1 :(得分:1)

另一个更简单的解决方案是将关系的“删除规则”设置为“Cascade”。然后,如果删除了一个对象,则会自动删除该关系另一端的对象。