将NSManagedObject的关系更改为不同的上下文

这是以前的问题的后续行动: 核心数据:以编程方式更改删除规则 。

我想重述一下我的问题,并在这里做到这一点。

简而言之,我的应用程序允许从第三方数据库更新条目,但我想保留用户注释。 所以我的工作stream程是:

  1. 遍历所有实体
  2. 下载外部XML并parsing成一个新的实体
  3. 如果用户注释,则将其关系从旧实体更改为新实体
  4. 删除旧的实体

在导入过程中,旧实体位于主要上下文中,新实体位于临时导入上下文中。 3号给我的问题,如果我只是改变关系,然后他们不显示,如果我更新我的用户界面。 如果我使用objectID来获取注释,然后更改关系,如下所示:

  NSManagedObjectID *objectId = oldAnnotation.objectID; Annotation *newAnnotation = [importContext objectWithID: objectId]; [newEntry addAnnotationObject: newAnnotation]; 

它还没有工作 – 它没有显示出来。

编辑:如果我将第二行中的上下文更改为newEntry.managedObjectContext ,我得到一个Illegal attempt to establish a relationship 'foo' between objects in different contexts错误Illegal attempt to establish a relationship 'foo' between objects in different contexts

我错过了什么?

更新:经过一些深夜拉发debugging后,我发现我在取得newEntry的时候,实际上是在取得oldEntry,所以没有任何的改变会显示出来。 @Mundi下面的答案指出了我的正确方向。

使用上面的代码复制旧的注释,然后复制这些属性。 对于一些有关系的用户input本身,我必须做一个“深层复制”,我在这里find: 我怎样才能复制或复制核心数据pipe理对象? 。

我认为创build一个新的实体并删除旧实体是一个有问题的策略。 您应该尝试正确更新现有的实体,只有在尚不存在的情况下才创build新的实体。

每当我需要一个不同的上下文的对象,我拿它 。 这就是说,你的对象ID代码应该工作。 但是,可能会有各种各样的其他故障,你应该检查:

  • 你保存了importContext吗?
  • 您是否保存了其父上下文,大概是主要的上下文?
  • 修改的对象图保存到持久性存储中吗?
  • 你保存是否检查结果?