orderDetail
与consume
相关。 consume
是从CoreDataContext
获取的,作为传递到此处的参数并且存在。
orderDetail = [NSEntityDescription insertNewObjectForEntityForName:@"OrderDetail" inManagedObjectContext:CoreDataContext];
orderDetail.order = consume
但是这段代码抛出异常:
非法尝试在不同环境中的对象之间建立关系'顺序'
我使用NSLog
NSLog(@"%@", orderDetail.managedObjectContext);
NSLog(@"%@", consume.managedObjectContext);
然后我发现orderDetail.managedObjectContext
存在,但consume.managedObjectContext
为nil
这是异常抛出的原因吗?我不知道为什么会这样。
更新我的问题,更多信息:
第一
我只有一个上下文
第二
当我删除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 ...异常抛出。
答案 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
的位置并修复它。