2012-04-19 51 views
4

这是我使用的代码行,这是导致该问题:“CoreData不能履行一个错误”错误的删除核心数据

[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

您是否正在使用刚删除的NSManagedObject实例?例如,被删除对象的一个​​实例是否仍然在支持tableview或其他东西的数组中? – 2012-04-19 17:10:58

回答

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和/或线程导致大多数问题。

+0

我刚测试过它,上下文是一样的。我现在不使用线程,所以没有这些问题。 – Andrew 2012-04-19 16:57:04

+0

尝试将对象的状态打印到控制台...所有属性...查看对象认为自己的内容...还打开了SQL调试...我没有启用CoreData任何东西。 – 2012-04-19 17:01:39

+0

好吧,我编辑它打开调试。 – Andrew 2012-04-19 17:13:04