【问题标题】:MagicalRecord importFromObject: JSON with dictionary?MagicalRecord importFromObject:带有字典的 JSON?
【发布时间】:2012-08-16 22:53:52
【问题描述】:

我正在解析一些以这种格式出现的 JSON:

{
dataId = "823o7tr23d387g";
category = "link";
details = {
    text = "Some text associated with the link";
    url = "http://www.url.com";
    thumbnail_url = "http://www.url.com/picture.jpeg";
};
source = "CNN";
},
{
...
},

MagicalRecord 有一个很棒的导入方法:+ (id) importFromObject:(id)data;,但它是否支持 JSON 字典中的字典,以便它可以自动将 details {} 映射到适当的属性?

是否有命名约定或我需要使用的东西?

【问题讨论】:

    标签: objective-c ios core-data magicalrecord


    【解决方案1】:

    查看这篇关于使用 MagicalRecord 自动导入 JSON 的文章,特别是数据 keypath 支持部分

    http://www.cimgf.com/2012/05/29/importing-data-made-easy/

    数据密钥路径支持

    键值编码是Objective C中常用且有效的工具。 MagicalImport 允许您访问其中的一些功能 将 keyPaths 指定为 mappedKeyName 的一部分。如果你熟悉 使用 KVC,这应该是一个相当简单的功能,因为 Magicalmport 将这些指定的键传递给 KVC 方法 盖子。 Keypath 支持允许您将数据映射到可能 没有与数据模型完全相同的层次结构。例如,一个 数据实体可能存储经纬度,但源数据 看起来更像这样:

    {
      "name": "Point Of Origin",
      "location":
      {
        "latitude": 0.00,
        "longitude": 0.00
      }
    }
    

    在这种情况下,我们可以指定我们的数据导入键路径, 我们 mappedKeyName 中的 location.latitude 和 location.longitude 配置挖掘嵌套数据结构并导入那些 值专门用于我们的核心数据实体。

    【讨论】:

    • 谢谢,很好的消息来源。请原谅我的无知,但我不是 100% 确定我如何映射它。如果我有一个属性detailsText,在此属性的用户信息中,我添加了 Key: details.text Value: id 但不幸的是,这并没有映射数据。跨度>
    • 您需要查看核心数据模型中的 userInfo 区域。单击一个实体或属性,然后查看实体检查器。它将出现在属性设置下方。这是一个简单的键值表接口。
    • 知道了!这篇文章读得太快了:)谢谢大家!
    【解决方案2】:

    Scott 提到的博客对于使用 MagicalRecord 的人来说是必读的。

    此外,如果默认的+ (id) importFromObject:(id)data 不适用于您的某些 NSDictionary 数据,您始终可以在您的 NSManagedObject 子类中重写 - (BOOL) importValuesForKeysWithObject:(id)objectData 方法以实现对映射的精确控制。

    这是我最近的一个项目中的一个 sn-p:

    // override MagicalRecord's implementation with additional set up for Dialogue relationship
    - (BOOL) importValuesForKeysWithObject:(id)objectData {
        BOOL result = [super importValuesForKeysWithObject:objectData];
    
        // update lesson-dialogue data
        id dialogueDicts = [objectData objectForKey:@"dialogue"];
        if ([dialogueDicts isKindOfClass:[NSArray class]]) {
            for (id dialogueDict in dialogueDicts) {
                DialogueSentence *dialogue = [DialogueSentence findFirstByAttribute:@"id" withValue:[[dialogueDict objectForKey:@"id"]];
                if (dialogue == nil) {
                    dialogue = [DialogueSentence createEntity];
                }
                [dialogue importValuesForKeysWithObject:dialogueDict];
                [self addDialoguesObject:dialogue];    // connect the relationship
            }
        }
    
        return result;
    }
    

    顺便说一句,您可能希望创建 NSManagedObject 子类的类别并在那里编写覆盖代码,因为当您升级 Core Data 模型版本并重新生成 NSManagedObject 子类时,您自己的代码不会被擦除出去。

    【讨论】:

    • 不知道为什么你必须这样做。 magicimport 的全部意义在于,这种样板文件是为您完成的。帮助我了解您对此的需求,以便我可以在未来的版本中更正此问题:the@magicalpanda.com
    • MagicalRecord 没有问题,只是有时候我要处理的项目一开始就没有考虑到MagicalRecord,即:核心数据属性没有正确命名,关系不完全相同作为 JSON。当我遇到这种情况时,还没有写博客“Import Data Made Easy”,所以我很难弄清楚。不过,如果我通过更新核心数据模型来关注博客,我会在某处记录更改,否则人们将不知道导入背后的魔力是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多