【问题标题】:Illegal attempt to establish a relationship 'order' between objects in different contexts非法尝试在不同上下文中的对象之间建立关系“顺序”
【发布时间】:2016-04-23 04:27:34
【问题描述】:

orderDetailconsume 相关。 consume 是从 CoreDataContext 获取的,作为传递给此处的参数并且存在。

orderDetail = [NSEntityDescription insertNewObjectForEntityForName:@"OrderDetail" inManagedObjectContext:CoreDataContext];
orderDetail.order = consume

但是这段代码抛出异常:

非法尝试在不同上下文中的对象之间建立关系“顺序”

我用NSLog检查异常

NSLog(@"%@", orderDetail.managedObjectContext);
NSLog(@"%@", consume.managedObjectContext);

然后我发现orderDetail.managedObjectContext是存在的,但是consume.managedObjectContextnil

这就是抛出异常的原因吗?我不知道为什么会这样。


更新我的问题,了解更多信息:

第一
我只有一个上下文

第二
当我删除 consume-entity 并重新插入 consume-entity 时发生这种情况:
当我将 A viewController 推送到 B viewController(B viewWillAppear) 时,我请求 orderDetail 并建立了 consume 的关系,当我在方法 viewWillAppear 中弹出到 A 时,我请求消费,当我收到数据时,我调用了

 [ CoreDataContext performBlock:^{
              [Consume cleanTheContext:CoreDataContext];...
... ... ... ...
                for (NSDictionary *consume in consumes) {
                    [Consume consumeWithLecaiInfo:consume inManagedObjectContext:CoreDataContext byUser:user];

       }];

清理旧的consume并插入新的consume(我知道我应该更新consume,而不是删除并重新插入,但我不知道为什么consume以这种方式丢失了它的managedObjectContext)

实际上这个错误偶尔会发生一次,push A,pop B,push A,pop B ...抛出异常。

【问题讨论】:

    标签: ios objective-c core-data


    【解决方案1】:

    错误是不言自明的,您可以修改代码以从您创建 orderDetail 的同一上下文中检索 consume 对象:

    OrderDetail *orderDetail = [NSEntityDescription insertNewObjectForEntityForName:@"OrderDetail" inManagedObjectContext:CoreDataContext]; 
    orderDetail.order = [CoreDataContext objectWithID:consume.objectID];
    

    objectID 是将对象从一个NSManagedObjectContext 转移到另一个的正确方法

    【讨论】:

    • 第二个上下文是nil,因此他不会在上下文之间传输对象。
    • 您可以为此目的使用任何上下文
    • 什么?你的评论没有任何意义。 OP 显然没有使用两个上下文。
    • 我没有使用两个上下文,我已经更新了我的问题,非常感谢。
    【解决方案2】:

    要形成关系,两个对象必须从相同NSManagedObjectContext创建。

    通常这不是问题,因为您的 UI 应该使用单个上下文,并且您的对象创建应该使用 NSEntityDescription.insert...

    由于您在其中一个对象中有一个nil 上下文,这意味着您要么在某处使用nil 上下文创建它,要么故意将nil 传递给NSManagedObjectContext.init...。这两种情况都有问题。

    跟踪您的创建代码并放置断点。找到nil 的位置并修复它。

    【讨论】:

    • 我从 CoreDataContext 获取了消费,所以它应该有一个 NSManagedObjectContext。我已经更新了我的问题,你能帮助分析这个问题吗?谢谢。
    • 不会改变我的答案。在您的代码中的某处,当您创建新的 Consume 对象时,您对上下文的引用是 nil。遍历创建代码,在调用[[NSManagedObject alloc] init...][NSEntityDescription insert... 的任何位置放置断点,并找到上下文在哪里nil
    • 我可以确定传递给 B viewController 的消费有它的 managedObjectContext ,但是当我请求 orderDetail 并将消费传递给这个请求的回调块时,在回调块中消费丢失了它的上下文。
    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多