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 并在结束时解锁。更新对象的线程也会锁定锁,直到更新和保存完成。非常感谢!

PS我很抱歉,但我通常不能因为严重的原因显示我的代码。

4

1 回答 1

2

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

发生“无法完成故障”错误是因为存在oldObject指向您已删除的其他一些对象的关系。这是由不正确的数据模型配置引起的,该配置在目标对象被删除时不会破坏关系。检查您的删除规则。一个必须设置为No Action

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

[myManagedObjectContext deleteObject:oldObject];

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

于 2011-08-16T22:10:26.570 回答