这是我正在使用的代码行,它导致了问题:
[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 和/或线程引起的。