iPhone Coredata保存错误

4
我正在尝试创建Core Data应用程序。有时在尝试保存数据时,我会看到以下错误:
错误:NSInvalidArgumentException, 原因:* -_referenceData64仅为抽象类定义。定义-[NSTemporaryObjectID_default _referenceData64]! 描述:* -_referenceData64仅为抽象类定义。定义-[NSTemporaryObjectID_default _referenceData64]!
我不明白为什么会出现这个错误,也不知道如何避免它。请问有人可以帮忙吗?

2
你的模型是什么样子? - Marcus S. Zarra
1个回答

4

编辑:原始答案在技术上是正确的,但并没有准确地描述错误的真正来源。运行时无法找到正确的属性,但它无法找到的原因是实体存在于另一个托管对象上下文中。可能从来没有为任何实体使用_referenceData64属性。

参见:http://www.cocoadev.com/index.pl?TemporaryObjectIdsDoNotRespondToReferenceData

原始回答:

您有一个具有 _referenceData64 属性的类。在数据模型中,该类被标记为“抽象”的。在数据模型编辑器中选择实体,并检查下面的复选框,以检查是否选中“抽象”。如果已选中,则这就是问题所在。

抽象实体永远不会被实例化。除非它有一个子类,否则您实际上无法将其属性设置为任何值。抽象实体只是存在于提供子类模板的作用。


2
那并不完全正确。_referenceData64是CoreData内部使用的隐藏抽象根对象上的属性,这个错误与您在模型中拥有的内容无关。当您做错事情(比如形成跨MOC关系)时,您会经常看到它,尽管我也相对确信,在正确编写的多线程代码中,有一些内部的CoreData线程错误也会导致这种情况发生。 - Louis Gerbarg
你似乎是正确的。我以前从未遇到过这种情况,但除非我犯了特定的错误,否则我不会遇到。然而,我的答案的基本概念是正确的。运行时试图在上下文中查找实体属性,但该属性不存在。显然,这已经足够让OP找到问题所在了。 - TechZen
补充:自从苹果添加了上下文并发类型支持以支持新的上下文,当使用NSMainQueueConcurrencyType时,该错误也可能由于竞争条件而被抛出。这可以通过改变为NSConfinementConcurrencyType来解决。 - epologee
@Irfan:抱歉,这篇文章已经快四年了,cocodev网站也不存在了。我已经记不清楚这个问题了。 - TechZen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接