2011-08-16 50 views
0

我有一个单身属性(作为managedObject)。该属性中的对象可能会被更新(删除,然后用自定义Id创建新对象,与旧对象的ID相同),然后保存上下文,取消属性,获取新对象并将其分配给属性。CoreData。成功保存无效对象

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

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

它是如何发生的?以及如何防止这种情况?我阅读coreData疑难解答“CoreData无法履行故障”。自从例子以来我没有发现我的问题。

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

P.S. 我很抱歉,但我通常不能以严肃的理由显示我的代码。

回答

1

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

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

要实际删除oldObject您必须告诉上下文的东西,如明确地将其删除:

[myManagedObjectContext deleteObject:oldObject]; 

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

+0

但我真的通过上下文删除对象,并检查所有删除规则,并确信所有规则分配给“级联”或“取消”。 – Arsynth

+0

删除后是否保存了上下文?在保存上下文之前,商店不会更改。 – TechZen

+0

是的,我做到了。而老对象,还有活断层存在与删除图有关系。它不经常发生,而不是所有的时间,使用相同的用户操作 – Arsynth