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

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

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

最佳答案

我认为你需要为这个问题提供更多的“上下文”。

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

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

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

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

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

我觉得现在就够了……

编辑

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

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

基本上,这些类型的问题在没有大量信息的情况下很难追踪,尤其是当您只使用一个线程和一个 MOC 时……因为大多数问题都是由使用多个 MOC 和/或线程引起的。

10-08 07:28
查看更多