NSManagedObject属性未在父NSManagedObjectContext上更新

时间:2013-01-14 16:25:28

标签: objective-c cocoa core-data nsmanagedobject nsmanagedobjectcontext

所以我有两个NSManagedObjectContext对象。父上下文和子上下文。我有几个NSManagedObjectModels,我能够创建/编辑/破坏其中的5个。没问题。我可以在子上下文中插入对象然后保存它,并在根上下文中弹出 voila

然而,这是给我带来麻烦的五分之一。我可以毫无问题地插入它,它将显示在根上下文中。当我尝试更改对象的属性时,虽然它没有在根上下文中更新。这是来自控制台的打印输出(请注意,value属性未更新)。

====root_context:("<Token: 0x1006f6a30> (
    entity: Token; 
    id: 0x107115130 <x-coredata:///Token/t2AC116F0-E89B-485D-B0A9-C3D2A58B84847> ; 
    data: {    association = 0;    
    equation = \"0x107114b10 <x-coredata:///Equation/t2AC116F0-E89B-485D-B0A9-C3D2A58B84846>\";    
    isValid = 0;    
    precedence = 0;    
    type = 0;    
    value = nil;})") 
====child_context:("<Token: 0x1071150a0> (
    entity: Token; 
    id: 0x107115130 <x-coredata:///Token/t2AC116F0-E89B-485D-B0A9-C3D2A58B84847> ; 
    data: {    association = 0;
    equation = \"0x107114b10 <x-coredata:///Equation/t2AC116F0-E89B-485D-B0A9-C3D2A58B84846>\";
    isValid = 0;
    precedence = 0;
    type = 0;
    value = 4;})"

从我的新手眼中,这些似乎是同一个对象。即使我打印出这两个对象的objectID(即使它们位于不同的上下文中),它们的objectID也匹配。

更多背景
要合并我正在调用[_childContext save:&error],它将更改推送到父上下文。每次检测到子上下文中的更改时,都会调用此代码。然后,一旦我在子上下文中观察到NSManagedObjectContextDidSaveNotification,我就会调用[_rootContext mergeChangesFromContextDidSaveNotification:notification]

附加说明
我不知道这是否是另一条线索,但是当我将数据保存到XML文件时,它会省略value属性。这是输出:

<object type="TOKEN" id="z104">
    <attribute name="type" type="int16">0</attribute>
    <attribute name="precedence" type="int16">0</attribute>
    <attribute name="isvalid" type="bool">0</attribute>
    <attribute name="association" type="int16">0</attribute>
    <relationship name="equation" type="1/1" destination="EQUATION" idrefs="z106"></relationship>
</object>

谢谢大家!

P.S。我检查了我的.xcdatamodeld文件,一切似乎都是有序的。我将值存储为String,其余的存储为Integer 16和Booleans。

2 个答案:

答案 0 :(得分:0)

看起来您的value属性在某种程度上未正确定义。这是一个清单:

  1. 您已检查数据模型中的数据类型
  2. 您还应该检查NSManagedObject子类的正确类型。
  3. 另外,请再次检查您设置新值的方式。

答案 1 :(得分:0)

嗯......还有很多东西可以学习CoreData。

基本上我遇到的问题是我是:

  1. 创建NSManagedObject,但不插入上下文。
  2. 更新新创建的对象的属性。
  3. 将对象插入上下文。
  4. 但是,如果我反向步骤1和2,而是首先将对象插入上下文,然后更新属性,它就可以正常工作。