iOS核心数据对象中的错误在上下文之间移动对象时使用ID

时间:2013-01-11 20:16:50

标签: ios5 core-data nsmanagedobject nsmanagedobjectcontext

我正在使用核心数据观察iOS中的一个奇怪的错误。 基本上,我的设置如下 - 有2个NSManagedObjectContexts,tempContextmainContext。 我使用tempContext作为临时“暂存器”来创建和编辑实体,当我想保存它们时,我将其移动到mainContext进行保存。 请注意,mainContext不是tempContext的父级。

此举如下 -

[1] newEntity.property1 = @"SomeProperty";
    newEntity.managedObjectContext // this is tempContext currently
[2] saveEntityInTempContext
[3] newEntity = (Entity *)[mainContext objectWithID:newEntity.objectID];
[4] [mainContext insertObject:newEntity];

现在,在插入[4]之后,如果我检查newEntity.property1,则将其设置为nil。 但是,如果我在[3]之后然后在[4]之后首先检查属性,它会将其正确显示为“SomeProperty”。我不明白强迫错误如何在这里发挥作用。

我的目标只是将实体从一个上下文移动到另一个上下文。

1 个答案:

答案 0 :(得分:1)

我不确定最直接的原因是什么,但这几乎可以肯定是一个不必要的步骤的奇怪副作用,实际上没有任何意义。我很惊讶你在最后一步没有得到例外。

具体而言,步骤#4完全没必要。完成步骤3后,您有一个从mainContext加载的实例。此时您无需再做任何其他事情。为同一个托管对象上下文查找的对象调用insertObject是没有意义的。

假设tempContextmainContext使用相同的持久性存储协调器,此对象的生命周期在您的步骤中按如下方式进行:

  1. newEntity已创建但未保存。 tempContext知道newEntity,但数据存储没有(当然mainContext也不知道)。
  2. 保存后,数据存储的记录为newEntitynewEntity的对象ID更改为永久值。
  3. 作为objectWithID:电话的结果,newEntity的实例将被替换为通过mainContext查找的其他实例。它的属性与您在步骤1中创建的属性相匹配,并在步骤2中保存到数据存储,因为它们是从数据存储中加载的。
  4. 调用insertObject没有任何意义 - 因为您在{3}中查找了您在步骤3中获得的新newEntity,这意味着mainContext已经知道了它。这是我原本应该例外的地方。没有异常发生,但呼叫仍然没有意义。
  5. 所以,我只是放弃第4步并完成它。