4

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

[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'

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

4

1 回答 1

10

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

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

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

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

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

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

我觉得暂时够了……

编辑

其他一些调试的东西......

结合上下文,抛弃所有关于状态的想法。插入/删除/注册/更新对象、propogatesDeletesAtaaendOfEvent、retainsRegisteredObjects 等...

Basically, these types of problems are very difficult to track down without lots of information, especially if you are only using one thread and one MOC... because most issues result from using multiple MOCs and/or threads.

于 2012-04-19T16:52:47.733 回答