上下文检测冲突对象

Posted

技术标签:

【中文标题】上下文检测冲突对象【英文标题】:context detectConflictsForObject 【发布时间】:2015-04-15 11:46:07 【问题描述】:

ios Core Data中,NSManagedObjectContextdetectConflictsForObject:上有一个方法

这个方法的文档说:

如果下一次调用 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合并冲突,当一个上下文正在保存对象更新而另一个正在删除对象时

CoreData 合并冲突显示托管对象版本更改而不是数据

Magical Record 检测到默认上下文没有变化

实体框架出错:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突

子父上下文保存冲突

检测动态分配的对象?