我正在使用核心数据观察iOS中的一个奇怪的错误。
基本上,我的设置如下 -
有2个NSManagedObjectContexts,tempContext
和mainContext
。
我使用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”。我不明白强迫错误如何在这里发挥作用。
我的目标只是将实体从一个上下文移动到另一个上下文。
答案 0 :(得分:1)
我不确定最直接的原因是什么,但这几乎可以肯定是一个不必要的步骤的奇怪副作用,实际上没有任何意义。我很惊讶你在最后一步没有得到例外。
具体而言,步骤#4完全没必要。完成步骤3后,您有一个从mainContext
加载的实例。此时您无需再做任何其他事情。为同一个托管对象上下文查找的对象调用insertObject
是没有意义的。
假设tempContext
和mainContext
使用相同的持久性存储协调器,此对象的生命周期在您的步骤中按如下方式进行:
newEntity
已创建但未保存。 tempContext
知道newEntity
,但数据存储没有(当然mainContext
也不知道)。newEntity
。 newEntity
的对象ID更改为永久值。objectWithID:
电话的结果,newEntity
的实例将被替换为通过mainContext
查找的其他实例。它的属性与您在步骤1中创建的属性相匹配,并在步骤2中保存到数据存储,因为它们是从数据存储中加载的。insertObject
没有任何意义 - 因为您在{3}中查找了您在步骤3中获得的新newEntity
,这意味着mainContext
已经知道了它。这是我原本应该例外的地方。没有异常发生,但呼叫仍然没有意义。所以,我只是放弃第4步并完成它。