1

我正在使用核心数据观察 iOS 中的一个奇怪错误。基本上,我的设置如下 - 有 2 个 NSManagedObjectContextstempContextmainContext. 我将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”。我不明白强制故障在这里应该如何产生影响。

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

4

1 回答 1

1

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

具体来说,步骤#4 是完全没有必要的。完成第 3 步后,您将拥有一个从mainContext. 那时你不需要做更多的事情。insertObject调用您刚刚从同一托管对象上下文中查找的对象是没有意义的。

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

  1. newEntity已创建但未保存。tempContext知道newEntity但数据存储不知道(当然mainContext也不知道)。
  2. 保存后,数据存储有一条记录newEntitynewEntity的对象 ID 更改为永久值。
  3. 由于您的objectWithID:调用, 的实例newEntity被替换为通过mainContext. 它的属性与您在步骤 1 中创建并在步骤 2 中保存到数据存储区的属性相匹配,因为它们是从数据存储区加载的。
  4. 调用insertObject没有任何目的 - 因为newEntity您在第 3 步中获得的新内容是从 查找的mainContext,这意味着mainContext已经知道它。这是我预期的例外。没有异常发生,但调用仍然没有意义。

所以,我会放弃第 4 步并完成它。

于 2013-01-12T00:25:38.073 回答