如果我有一个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,特别是因为类引用明确告诉我不要。
答案 0 :(得分:1)
以下是我现在要解决的问题:
- (void)setDefaultSet:(NSSet *)set
{
NSMutableSet *oldSet = [self mutableSetValueForKey:@"defaultSet"];
for (NSManagedObject *object in oldSet)
//remove object from context
[oldSet removeAllObjects];
[oldSet addObjectsFromArray:[set allObjects]];
}
我添加了自己的访问者/ mutator