上下文检测冲突对象
Posted
技术标签:
【中文标题】上下文检测冲突对象【英文标题】:context detectConflictsForObject 【发布时间】:2015-04-15 11:46:07 【问题描述】:在ios Core Data中,NSManagedObjectContext
detectConflictsForObject:
上有一个方法
这个方法的文档说:
如果下一次调用 save: 对象在其持久存储中被修改,则保存失败。这允许对未更改的对象进行乐观锁定。始终对更改或删除的对象执行冲突检测。
我有一个[context save]
,无论我是否使用detectConflictsForObject
,它都会引发异常。
我认为这种方法可以帮助我确定对[context save]
的调用是否会导致崩溃。
我的具体情况是这样的。 我有上下文 A 是 B 的父上下文。B 是 C 的父上下文。
一些NSManagedObject
已从B 中删除,一段时间后[C save]
即将被调用。这会导致"could not fulfill a fault"
异常,我认为我可以使用detectConflictsForObject
方法及早检测到,从而避免崩溃。
【问题讨论】:
【参考方案1】:本文档"Troubleshooting Core Data" 中描述了此问题。我认为您尝试从先前在其他上下文中删除的对象中检索属性或关系。要检查对象是否存在,您可以使用 NSManagedObjectContext 的existingObjectWithID:error: 方法。如果对象无法获取、不存在或无法出错,则返回 nil。例如:
- (void)doSomethingWithAttributesOfObject:(NSManagedObject *)object
if ([self.managedObjectContext existingObjectWithID:object.objectID error:nil])
; // you can do something with object
else
; // object was deleted
【讨论】:
existingObjectWithID:error:
在第一次在上下文中评估对象时工作正常。如果我评估一个实体及其属性,然后从父上下文中删除该实体,而该实体始终保留在内存中。对existingObjectWithID:error:
的调用将返回对象的“缓存”版本,并且如果它认为没有必要,则不会联系父上下文。它也与上下文中的stalenessInterval
有关。
是的,你是对的。此方法可以返回一个缓存的对象。但它永远不会返回错误。因此,当您在此检查后尝试访问托管对象的属性时,不会导致异常。以上是关于上下文检测冲突对象的主要内容,如果未能解决你的问题,请参考以下文章
解决RestKit中的CoreData合并冲突,当一个上下文正在保存对象更新而另一个正在删除对象时
实体框架出错:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突