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

时间:2016-04-23 04:27:35

标签: ios objective-c core-data

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时发生这种情况:
当我将一个viewController推送到B viewController(B viewWillAppear)时,我请求orderDetail并建立了consume的关系,当我在方法A中弹出viewWillAppear时我请求消费,当我收到数据时,我打电话给

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

       }];

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

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

2 个答案:

答案 0 :(得分:0)

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

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

objectID是将对象从一个NSManagedObjectContext转移到另一个

的正确方法

答案 1 :(得分:0)

对于要形成的关系,必须从相同 SELECT t.user_id, t.symbol, sum(case when t.type = 'SELL' then -t.volume else t.volume end) as total_volume, sum(t.volume * t.unit_price * (case when t.type = 'SELL' then -1 else 1 end) end)) as value FROM transaction t GROUP BY t.user_id, t.symbol; 创建两个对象。

通常这不是问题,因为您的UI应该使用单个上下文,而您创建的对象应该使用NSManagedObjectContext

由于您的某个对象中有NSEntityDescription.insert...个上下文,这意味着您要在某处使用nil上下文创建它,或者您有意将nil传递给{{1} }}。这两种情况都是一个问题。

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