我在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];
。
必须有更好的方法。我做错了什么?
答案 0 :(得分:3)
您的解决方案有效且您的方法正确无误。核心数据不会自动删除悬空的孩子。您需要明确删除它。然而,“where”受到质疑。
如果您真的总是想在添加这样的新子项之前删除现有子项,那么我将在set访问器中的父对象的子类中处理它。这将允许您在执行删除之前检查是否相等。这也将从您的(可能)视图控制器中删除此维护工作。
好的,谢谢。所以我应该使用setPrimitiveValue&创建一个自定义setter。朋友?
正确。您还需要使用KVO方法(-willChangeValueForKey:
和-didChangeValueForKey:
),以便您的访问者做正确的事。
答案 1 :(得分:1)
另一个更简单的解决方案是将关系的“删除规则”设置为“Cascade”。然后,如果删除了一个对象,则会自动删除该关系另一端的对象。