我有一对多关系A< --->> B(多对部分订购).
>删除A时,所有与A关系的B都应该被删除,所以A与B的关系的删除规则设置为级联 – >工作正常
>删除B时,只能将关系恢复为A,因此B与A的关系的删除规则设置为nullify – >不工作(只有延迟)
问题描述:
所以我有与这个问题“Core Data Nullify rule doesn’t work?”中提到的完全相同的问题:我删除一个与A有关系的B,并且之后,我计算剩余B的数量,A与A有关系,它与之前.在这个问题上接受的答案是使用级联而不是无效,因为无效是:
Nullify sets the pointer to null when the object is deleted. If you
have an array of pointers it doesn’t remove it,it just sets it to
null.
我看到有两个问题:
>我很确定级联是错误的规则在这种情况下,因为它也会删除A,当删除B,这不是我想要实现的. (我尝试了,结果是我的预期:A也被删除).
>一个集合不能有null作为其元素之一,除了一个使用NSNull单例.所以我怀疑这是无效规则所做的.
经过一番实验,我发现,如果我删除B的一个实例,它立即被删除,但与A的关系不会立即清除,但只有一点点延迟之后:
// Method is called by pressing a button -(void)removeLastBOfA:(A *)instanceOfA { // Prints 4 NSLog(@"fetch all b's count before:%d",[context fetchAllBs].count); // Prints 4 NSLog(@"A's relation to B count before: %d",instanceOfA.relationToB.count); [context deleteObject:[instanceOfA.relationToB lastObject]]; // Prints 3 NSLog(@"fetch all b's count after:%d",[context fetchAllBs].count); // Prints 4,but should be 3. Last Object of A's relationToB is still the object that was deleted NSLog(@"A's relation to B count after: %d",instanceOfA.relationToB.count);
}
现在按下按钮再次调用上面的方法,而不做任何事情之间,突然之间的关系被更新,并且打印出“A与B计数之前的关系:3”.所以无效删除规则确实按照我想要的方式工作,但有一点延迟.
问题:
我所说的2个问题是否有效?
>为什么无效只能在延迟之后更新关系,这是什么延迟?或者在删除NSManagedObject之后,关系得到更新?
解决方法
>明确删除关系:
NSManagedObject* objectToDelete = [instanceOfA.relationToB lastObject]; [context deleteObject:objectToDelete]; NSMutableSet* relationships = [instanceOfA mutableSetValueForKey:@"relationToB"]; [relationships removeObject:objectToDelete];
>询问上下文以处理其未来的变化(这意味着计算由删除引起的变化):
[context processPendingChanges];
在你的例子中:
[context deleteObject:[instanceOfA.relationToB lastObject]]; [context processPendingChanges]; // Prints 3 NSLog(@"fetch all b's count after:%d",[context fetchAllBs].count); NSLog(@"A's relation to B count after: %d",instanceOfA.relationToB.count);
之后,您将看到预期的结果.
NSManagedObjectContext在运行循环结束时或执行-save:时自行执行-processPendingChanges,这就是为什么会看到一些延迟.
希望它有帮助.