Magical Record 关系返回空对象

Posted

技术标签:

【中文标题】Magical Record 关系返回空对象【英文标题】:Magical Record relationship return empty objects 【发布时间】:2014-08-01 09:37:54 【问题描述】:

我的模型中有两种类型的对象——比如说KidParent。我以 JSON 格式从 ios 应用程序中的服务器获取它们,如下所示:


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

如您所见,KidParent 对象有一个 To-Many 关系。我正在使用 Magical Record 来存储日期,并且我在 Core Data Model 中有这种关系,以便能够获取 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 时,它会返回一个空对象数组。因此,对于第一个孩子,它返回一个 Parentoid == nil,对于第二个孩子,它返回两个 Parent,都带有 nil 属性。为了更好的可读性,我简化了代码,两个对象中还有很多其他属性,而且都是 nil。

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

【问题讨论】:

【参考方案1】:

首先,我认为这段代码实际上并没有做任何事情......

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

    [kid parent];

如果你想清除关系,你可以只 nil to many side,一切都会断开。但是,除非您明确删除数据,否则不会删除数据。寻找-MR_deleteEntity 方法来帮助您。

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

第三,无需在 updateFromDictionary 方法中创建数据字典的 mutableCopy。

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

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

【讨论】:

[kid parent] 显然是我的错误,应该是[kid removeParentsObject...],已编辑。谢谢你的第二个说明,我会考虑的。第三个-我应该删除有问题的这一行-在实际代码中,我删除了那里的所有 NSNull 对象。没必要,因为我会按照您的建议查看 MagicalRecord 映射。嗯,我会检查我是否通过了正确的字典,但我相信它们也是正确的。感谢您的建议

以上是关于Magical Record 关系返回空对象的主要内容,如果未能解决你的问题,请参考以下文章

Magical Record添加对象,不同的上下文错误

无法将空对象设置为 Record 类型的参数的默认值

空对象模式

我的 ObjectType 正在返回一个空对象 [重复]

设置一对多关系 Core Data 和 Magical Record

导入与 Core Data 和 Magical Record 的关系