【问题标题】:CoreData Relationship Setting without Context?没有上下文的CoreData关系设置?
【发布时间】: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 对象后立即插入它,则不会发生此错误。但随之而来的问题是,如果用户取消并且不再需要此飞行对象怎么办?

【问题讨论】:

    标签: ios iphone core-data nsmanagedobjectcontext


    【解决方案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 中
      猜你喜欢
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 2023-03-26
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多