如果我有一个NSManagedObject保留另一种类型的NSManagedObject作为其属性之一,并且将其设置为nil或将其替换为其他集合,那么原始集中的托管对象会怎样?他们会在数据库中孤立吗?我知道如果删除父托管对象,则可以级联删除,但这不是同一回事。
我想它是否是集合都没有关系。如果一个托管对象引用了另一个对象,现在您希望它引用其他内容,而不再关心旧对象,则必须删除它。
我做了一些自己的测试:
NSSet *set = [managedObject getDefaultSet]; //at this point I can access the set
[managedObject setDefaultSet:newSet]; //at this point I can't access it anymore!
似乎CoreData做了一些魔术,因为在我用新的集替换集之后,我无法再使用gdb访问旧的集。但是这是否意味着它不再存在于数据库中?我无法访问它,但还需要从数据库中物理删除它吗?
编辑:新测试:
NSSet *set = [managedObject getDefaultSet]; //at this point I can access the set
id object = [set anyObject];
[managedObject setDefaultSet:newSet]; //at this point I can't access it anymore! BUT I can still access the object
我已经验证了该对象仍然存在,所以现在我想我需要删除它。我的猜测是重写setDefaultSet属性。核心数据的默认mutator属性是什么样的?我不认为我想覆盖setValue:forKey,尤其是因为类引用明确告诉我不要这样做。
最佳答案
这是我现在要使用的解决方案:
- (void)setDefaultSet:(NSSet *)set
{
NSMutableSet *oldSet = [self mutableSetValueForKey:@"defaultSet"];
for (NSManagedObject *object in oldSet)
//remove object from context
[oldSet removeAllObjects];
[oldSet addObjectsFromArray:[set allObjects]];
}
我添加了自己的访问器/更改器
关于objective-c - 管理NSManagedObjects,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7272552/