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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有上下文的CoreData关系设置?相关的知识,希望对你有一定的参考价值。

我有两个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对象,就不会发生此错误。但是它会产生一个问题,如果用户取消并且不再想要这个飞行物体怎么办?

答案

为什么不使用一组父子语境。继续在子环境中插入所有内容。如果用户最终选择“保存”,则首先在子上下文中调用save:selector(然后再调用父上下文)。如果用户最终选择“取消”,则在子上下文中调用rollback:selector。

http://www.cocoanetics.com/2012/07/multi-context-coredata/

另一答案

听起来最终,用户将保存这些更改或取消它们,并且在此期间不会发生其他CoreData操作。如果这是真的,当你准备好保存时,请打电话给NSManagedObjectContext's save:然后。否则,调用它的rollback和撤消堆栈中的所有更改(即,自上次调用save:以来您已更改的所有内容,例如flight的创建)将被撤消。

另一答案

使用飞机和飞行的临时环境......划痕背景

这是推荐的AFAICS方式

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

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

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

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

CoreData 关系延迟加载?

CoreData 预取在属性中没有错误

setOnItemClickListener没有对点击片段进行任何操作

CoreData 和一对多关系的并发错误