CoreData.成功保存无效对象



我有属性(作为managedObject)在一个单例。这个对象在属性可以被更新(删除,然后创建一个新的自定义Id的对象,等于旧对象的Id),然后我保存上下文,取消属性,获取新的对象,并将其分配给属性。

我没有错误,一切正常。重新启动应用程序后,我得到了"CoreData无法完成故障"异常。我确实通过sqliteBrowser打开了数据库,看到了一个旧对象和一个新对象。新对象是正确的。旧对象(应该删除的对象)与已删除的对象有关系。

另外,当不同的线程更新一个对象时,UI可以使用managedObject访问属性。

它是如何发生的?如何预防呢?我读了coreData故障排除"coreData无法完成故障"。我没有找到我的问题,因为例子。

我对此很困惑。我有想法,但不确定,它是什么好方法:如果让属性不作为managedObject,而是作为id(自定义id,作为NSNumber),重载setter和getter。Setter接收相同的对象,但可以访问自定义id并为属性分配id。Getter -通过id获取对象,保存在属性中。Getter和setter会在开始时锁定NSLock并在结束时解锁这个。更新对象的线程也会锁定该锁,直到更新和保存完成。大感谢!

注:我很抱歉,但是我经常因为严重的原因不能展示我的代码。

取消设置为托管对象的类的属性不会从上下文或存储中删除该托管对象,因为两者都保留了独立于任何其他保留的托管对象。该对象将继续存在于内存和存储中,并保持您为其设置的任何关系,直到上下文删除该对象。

"cannot complete a fault"错误正在发生,因为oldObject具有指向您已删除的其他对象的关系。这是由于不正确的数据模型配置造成的,当删除目标对象时,该配置不会破坏关系。检查你的删除规则。其中一个必须设置为No Action

要真正删除oldObject,你必须告诉上下文明确地删除它,如:

[myManagedObjectContext deleteObject:oldObject];

…或者设置其他实体的关系,使用cascade删除规则将其删除。

相关内容

最新更新