微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除核心数据对象时出错:NSManagedObjectContext无法在其他上下文中删除对象

如何解决删除核心数据对象时出错:NSManagedObjectContext无法在其他上下文中删除对象

|| 尝试从核心数据存储中删除对象时遇到问题。调用
deleteOject
时收到的错误如下:
An NSManagedobjectContext cannot delete objects in other contexts.
我已经找到了一些有关此错误的在线文档,但主要与在多个线程中访问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);
    }
}
    

解决方法

        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]
这将打印分配堆栈跟踪,并向您显示创建两个Moc的位置。     ,        解决此问题的最简单方法是先记录管理对象的上下文,然后记录每个“ 6”对象的“ 5”属性,然后再删除它。如果错误是正确的,则两个上下文的地址将不匹配。如果没有多个上下文,则每个ѭ6的
managedObjectContext
属性很可能是
nil
。 如果直接(即使用alloc-init)初始化托管对象,但再也没有通过将其ѭ5属性设置为上下文来将其分配给上下文,则会出现此错误。受管对象上下文会将自身以外的任何值视为另一个上下文,即使该值是nil值也是如此。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。