这是我正在使用的代码行,这导致了问题:
[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'
不确定这是否有助于找到问题所在?
答案 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和/或线程造成的。