2011-06-13 31 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属性设置为上下文,则永远不会将其分配给上下文,则可能会出现此错误。一个托管对象上下文会将除自身以外的任何值视为另一个上下文,即使该值是零值。

相关问题