没有上下文的CoreData关系设置?
Posted
技术标签:
【中文标题】没有上下文的CoreData关系设置?【英文标题】:CoreData Relationship Setting without Context? 【发布时间】:2014-01-19 14:10:36 【问题描述】:我有两个NSManagedObject
子类。 Flight
和 Aircraft
。每个Flight
关联一个Aircraft
。
当用户创建Flight
时,我只做以下事情:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Flight" inManagedObjectContext:self.managedObjectContext];
self.flight = [[Flight alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
创建对象但不要将其插入managedObjectContext
,直到用户确定他们想要保存它。如果他们保存,我插入对象,如果他们取消,它被丢弃。
到目前为止,这是一个很好的解决方案。当用户选择Aircraft
时,我会这样做:
[self.flight setAircraft:aircraft];
但是,由于 flight
对象尚未插入到 managedObjectContext
中,因此应用程序崩溃并出现以下错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'aircraft' between objects in different contexts
这是有道理的。如果我在创建flight
对象后立即插入它,则不会发生此错误。但随之而来的问题是,如果用户取消并且不再需要此飞行对象怎么办?
【问题讨论】:
【参考方案1】:为什么不只使用一组父子上下文。继续在子上下文中插入所有内容。如果用户最终选择“保存”,请先在子上下文中调用 save: 选择器(然后再调用父上下文)。如果用户最终选择“取消”,则在子上下文中调用 rollback: selector。
http://www.cocoanetics.com/2012/07/multi-context-coredata/
【讨论】:
【参考方案2】:听起来最终,用户要么保存这些更改,要么取消它们,并且在此期间不会发生其他 CoreData 操作。如果这是真的,当您准备好保存时,请致电NSManagedObjectContext's
save:
。否则,调用它的rollback
,撤消堆栈中的所有更改(即自上次调用save:
以来所做的所有更改,例如flight
的创建)都将被撤消。
【讨论】:
我同意这个操作,苹果也同意 AFAICS --> 他们推荐一个从头开始的上下文 我不会将未完成的数据放入任何“全局上下文”中【参考方案3】:为飞机和航班使用临时上下文......临时上下文
这是推荐的 AFAICS 方式
如果用户点击保存,保存上下文,否则..什么都不做
【讨论】:
我的印象是Flight
和Aircraft
对象都需要属于同一个上下文。但是,我看不到临时的如何工作,因为飞机已经保存到主上下文中。
然后重新获取它:) 你说得对,他们需要在同一个 ctx 中以上是关于没有上下文的CoreData关系设置?的主要内容,如果未能解决你的问题,请参考以下文章