CoreData。成功保存无效对象

时间:2011-08-16 16:29:29

标签: core-data nsmanagedobject objective-c-2.0

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

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

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

怎么会发生?以及如何防止这种情况?我读了“CoreData无法解决故障”的coreData故障排除。自从例子我没有找到我的问题。

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

P.S。 我很抱歉,但我通常无法通过严肃的理由展示我的代码。

1 个答案:

答案 0 :(得分:1)

将类集的属性设置为托管对象不会从上下文或商店中删除托管对象,因为两者都保留托管对象,而与任何其他保留无关。该对象将继续存在于内存和存储中,并将维护您为其设置的任何关系,直到上下文删除该对象。

发生了“无法完成故障”错误,因为oldObject具有指向您已删除的其他对象的关系。这是由于不正确的数据模型配置导致在删除目标对象时不会破坏关系。检查删除规则。必须将其设置为No Action

要实际删除oldObject,您必须告诉上下文明确删除它,例如:

[myManagedObjectContext deleteObject:oldObject];

...或使用cascade删除规则设置其他实体的关系以将其删除。