删除核心数据时“CoreData无法解决故障”错误

时间:2012-04-19 16:33:22

标签: iphone objective-c ios core-data

这是我正在使用的代码行,这导致了问题:

[self.managedObjectContext deleteObject:object];

然后当它保存上下文时,会导致崩溃:

Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault'

编辑:使用'-com.apple.CoreData.SQLDebug 1'运行代码。

CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: DELETE FROM ZENTRY WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: COMMIT
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCREATIONDATE, t0.ZMESSAGE, t0.ZSECTIONIDENTIFIER, t0.ZVERSION FROM ZENTRY t0 WHERE  t0.Z_PK = ? 
CoreData: annotation: sql connection fetch time: 0.0042s
CoreData: annotation: total fetch execution time: 0.0096s for 0 rows.
    CoreData: annotation: fault fulfilled from database for : 0x209010 <x-coredata://[edited out long code here]/Entry/p34>
 *** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault'

不确定这是否有助于找到问题所在?

1 个答案:

答案 0 :(得分:10)

我认为你需要为这个问题提供更多的“背景”。

但是,有几个地方可以找到您的问题。首先,您使用多个ManagedObject上下文吗?如果是这样,请确保self.managedObjectContext与object.managedObjectContext相同。

您使用的是多线程吗?如果是这样,那么您必须使用多个MOC。确保您只在“其”线程上使用MOC。

如果您正在使用包含策略,则表示在您创建它的线程上使用MOC。如果是其他两个中的一个,那么你应该在performBlock或performBlockAndWait中执行MOC代码。

获取要保存的对象的对象ID,并查看它是否在SQL文件中。

您可以打开核心数据sql调试标志(将“-com.apple.CoreData.SQLDebug 1”添加到方案中启动时传递的参数),并在应用运行时观察SQL语句日志到控制台。它可以帮助您追踪到底发生了什么。

我认为现在已经够了......

修改

其他一些调试内容......

通过上下文,转储它对状态的所有想法。插入/删除/注册/更新对象,propogatesDeletesAtaaendOfEvent,retaininsRegisteredObjects等...

基本上,这些类型的问题很难在没有大量信息的情况下进行跟踪,特别是如果您只使用一个线程和一个MOC ......因为大多数问题都是由于使用多个MOC和/或线程造成的。