2012-04-19 52 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