我有一对多的关系A< --->> B(订购了多对部分)。
所以我遇到了与这个问题"Core Data Nullify rule doesn't work?"中提到的问题完全相同的问题:我删除了一个与A有关系的B,然后我立即计算剩余B的数量,A有关系和以前一样。该问题中接受的答案是使用级联而不是无效,因为nullify的作用是:
删除对象时,Nullify将指针设置为null。如果你 有一个指针数组,它不会删除它,它只是将其设置为 空。
我在回答中看到了两个问题:
经过一些实验后我发现,如果我删除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 ”。因此,nullify删除规则确实可以正常工作,但有一点延迟。
答案 0 :(得分:15)
是的,你是对的。答案是不正确的。关于第二点。方法-deleteOdject不会删除对象,因为它只是将对象标记为已删除。要完成删除,您需要保存托管对象上下文,然后您将看到nullify规则按预期工作。如果您此时不想保存上下文,可以采用以下两种方式:
明确删除关系:
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在运行循环结束时或执行-processPendingChanges
时自行-save:
,这就是为什么你会看到一些延迟。
希望它有所帮助。
答案 1 :(得分:0)
完成对Core Data对象的更改后,应在托管对象上下文中调用save:。我想保存操作将更新所有关系。