魔法记录关系返回空对象

时间:2014-08-01 09:37:55

标签: ios core-data magicalrecord

我的模型中有两种类型的对象 - 比方说KidParent。我通过JSON中的iOS应用程序从服务器获取它们,如下所示:

{
  "kids": [
    {
      "id": 1,
      "parents": [
        {
          "id": 1
        }
      ]
    },
    {
      "id": 2,
      "parents": [
        {
          "id": 1
        },
        {
          "id": 2
        }
      ]
    }
  ]
}

如您所见,KidTo-Many对象有Parent关系。我正在使用魔法记录存储日期,我在核心数据模型中有这种关系,以便能够获得kid.parents个对象。

从服务器获取它们时,我正在使用此代码:

for (NSDictionary *kidDict in objects)
        {
            NSNumber *oid = kidDict[@"id"]; // i'm using 'oid' in Obj-C when there is a need to use 'id' keyword
            Kid *kid = [Kid MR_findFirstByAttribute:@"oid" withValue:oid];
            if (kid == nil)
            {
                kid = [Kid MR_createEntity];
            }

            [kid updateFromDictionary:kidDict];
            [self updateParentsFromArray:kidDict[@"parents"] forKid:kid];
         }

         [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];


// ...

+ (void)updateParentsFromArray:(NSArray *)parents forKid:(Kid *)kid
{
// clearing current relationship
    NSSet *kidParents = [kid.kidParents copy];
    for (Parent *parent in kidParents)
    {
        [kid removeParentsObject:parent];
    }

    for (NSDictionary *parentDict in *parents)
    {
        NSNumber *oid = parentDict[@"id"];
        Parent *parent = [Parent MR_findFirstByAttribute:@"oid" withValue:oid];
        if (!parent)
        {
            parent = [Parent MR_createEntity];
        }
        [parent updateFromDictionary:parentDict]; // updating current object to catch all server changes for it
        [kid addParentsObject:parent];
    }
}

// Kid and Parent updating method

- (void)updateFromDictionary:(NSDictionary *)dictionary;
{
    NSMutableDictionary *dict = [dictionary mutableCopy];

    if (dict[@"id"]) self.oid = dict[@"oid"];
}

但是,当我想获得kid.parents时,它会返回空对象数组。因此,对于第一个孩子,它会返回一个Parent oid == nil,第二个孩子返回两个Parent,两个都有nil个属性。我简化了代码以提高可读性,两个对象中都有很多其他属性,并且所有属性都是零。

为什么会这样?我在保存方面做错了吗?我找到了this question,但似乎我的课程是正确的。

1 个答案:

答案 0 :(得分:0)

首先,我不认为这段代码实际上做了什么......

// clearing current relationship
NSSet *kidParents = [kid.kidParents copy];
for (Parent *parent in kidParents)
{
    [kid parent];
}

如果你想要清除这些关系,你可以将这个关系弄到一边,一切都将被断开。但是,除非您明确删除数据,否则不会删除数据。寻找-MR_deleteEntity方法来帮助您。

其次,在使用一对多关系时,我更喜欢使用parent.kid = kid语法,而不是[kid addParentsObject:parent]。它使事情更容易阅读。

第三,没有必要在updateFromDictionary方法中创建数据字典的mutableCopy。

第四,实际问题可能是您没有将正确的字典子集传递给updateFromDictionary方法。看起来您只是传入顶级字典而不是父母特定信息。您可以告诉这一点,因为您仍然获得非零对象,但没有数据。 if-check on data是一个赠品,数据不包含在传入的字典中。

另外,我会提到MagicalRecord已经为您编写了导入代码。您需要做的就是将源数据映射到CoreData模型。这些映射(当前)驻留在用户信息字典中的实体模型文件(可视实体编辑器)中。我建议看看(简短)instructions I wrote on CocoaismyGirlfriend.com