2011-06-13 29 views
2

我在嘗試從Core Data存儲中刪除對象時遇到問題。調用deleteOject當我收到錯誤如下:An NSManagedObjectContext cannot delete objects in other contexts.刪除核心數據對象時出錯:NSManagedObjectContext無法刪除其他上下文中的對象

我已經找到關於此錯誤的在線文檔,但大都涉及多個線程這可能會導致問題訪問ManagedObjectContext,但我目前沒有工作的其他任何線程。我已經通過我的代碼試圖確保我沒有創建任何其他上下文,除了我在我的AppDelegate中創建的並且找不到可能的罪魁禍首。

,我用來測試的代碼如下:

NSMutableSet *remoteNids = [NSMutableSet setWithObjects:@"140", @"141", nil]; 
for (GCEvent *event in nodeEventsFromStore) { 
    if (![remoteNids containsObject:event]) { 
     NSLog(@"Event no longer exists on remote. Removing object %@ from store.", event); 
     [[delegate managedObjectContext] deleteObject:event]; 
    } 
    else { 
     NSLog(@"Event %@ exists on remote", event); 
    } 
} 

回答

4

Core Data對你說謊的可能性很小。我建議把斷言在你的代碼是這樣的:

NSAssert([delegate managedObjectContext] == [event managedObjectContext], @"Found two contexts: %@ and %@", [delegate managedObjectContext, [event managedObjectContext]); 

與斷點通過Xcode中運行你的應用程序(因此它打破了,當你打的斷言),並設置MallocStackLoggingNoCompact = YES。

當斷言被觸發,你可以使用gdb控制檯,像這樣:

(gdb) info malloc [address of event's MOC] 
(gdb) info malloc [address of delegate MOC] 

,你創建的兩個郵電部,將打印的頁頭堆棧跟蹤,並告訴你。

+0

非常酷!我在哪裏可以瞭解更多關於gdb命令的知識? – Moshe 2011-06-17 07:43:14

+0

這是我的最愛之一:http://www.delorie.com/gnu/docs/gdb/gdb_toc.html – ImHuntingWabbits 2011-06-17 07:55:32

+0

這幫助我追蹤了這個問題。我的代碼在for循環中取代字典的鍵而不是值,這是一個問題。謝謝! – markdorison 2011-06-19 18:18:14

1

最簡單的方法來解決,這將是記錄的管理對象上下文,然後每個GCEvent對象的managedObjectContext屬性刪除之前。如果錯誤是正確的,則兩個上下文的地址不匹配。如果您沒有多個上下文,則每個GCEventmanagedObjectContext屬性最有可能是nil

如果直接初始化管理對象(即使用alloc-init),但是通過將其managedObjectContext屬性設置爲上下文,則永遠不會將其分配給上下文,則可能會出現此錯誤。一個託管對象上下文會將除自身以外的任何值視爲另一個上下文,即使該值是零值。

相關問題