没有上下文的CoreData关系设置?

Posted

技术标签:

【中文标题】没有上下文的CoreData关系设置?【英文标题】:CoreData Relationship Setting without Context? 【发布时间】:2014-01-19 14:10:36 【问题描述】:

我有两个NSManagedObject 子类。 FlightAircraft。每个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'ssave:。否则,调用它的rollback,撤消堆栈中的所有更改(即自上次调用save: 以来所做的所有更改,例如flight 的创建)都将被撤消。

【讨论】:

我同意这个操作,苹果也同意 AFAICS --> 他们推荐一个从头开始的上下文 我不会将未完成的数据放入任何“全局上下文”中【参考方案3】:

为飞机和航班使用临时上下文......临时上下文

这是推荐的 AFAICS 方式

如果用户点击保存,保存上下文,否则..什么都不做

【讨论】:

我的印象是FlightAircraft 对象都需要属于同一个上下文。但是,我看不到临时的如何工作,因为飞机已经保存到主上下文中。 然后重新获取它:) 你说得对,他们需要在同一个 ctx 中

以上是关于没有上下文的CoreData关系设置?的主要内容,如果未能解决你的问题,请参考以下文章

具有按关系批量获取的多上下文 CoreData

RestKit/CoreData 没有立即将关系保存到持久存储

CoreData 预取在属性中没有错误

核心数据:非法尝试建立关系+(空)上下文

CoreData 关系延迟加载?

Core Data - 如何在不同的上下文中建立两个对象之间的关系