【问题标题】:RestKit - Hydrate array of foreign keysRestKit - 水合外键数组
【发布时间】:2012-12-05 15:08:41
【问题描述】:

我有以下 JSON:

{
    "users": [
        {"id": "1", "name": "John Doe"},
        {"id": "2", "name": "Bill Nye"}
    ],
    "groups": [
        {"id": "1", "name": "Group1", "users": ["1", "2"]},
        {"id": "2", "name": "Group2", "users": ["1"]}
    ]
}

...以及带有用户和组对象的核心数据模型。组对象与用户具有一对多关系 (NSSet)。

我发现以下线程似乎表明这是可能的,但没有解释如何执行这种映射:

https://github.com/RestKit/RestKit/issues/284

如何执行此映射以正确连接每个组的“用户”关系?

注意:我已设置映射,可将 JSON 用户和组正确映射到其各自的核心数据对象。但是,每个组的“用户”NSSet 是空的。

【问题讨论】:

    标签: objective-c ios cocoa-touch core-data restkit


    【解决方案1】:

    所以,我使用 RestKit 0.20(pre2) 解决了这个问题。

    JSON 需要更改为以下内容(注意组的 users 数组中的属性名称):

    {
        "users": [
            {"id": "1", "name": "John Doe"},
            {"id": "2", "name": "Bill Nye"}
        ],
        "groups": [
            {"id": "1", "name": "Group1", "users": [{"id" : "1"}, {"id" : "2"}]},
            {"id": "2", "name": "Group2", "users": [{"id" : "1"}]}
        ]
    }
    

    然后,以下映射:

    RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:managedObjectStore];
    userMapping.identificationAttributes = @[@"id"];
    [userMapping addAttributeMappingsFromArray:@[@"id", @"name"]];
    RKEntityMapping *groupMapping = [RKEntityMapping mappingForEntityForName:@"Group" inManagedObjectStore:managedObjectStore];
    groupMapping.identificationAttributes = @[@"id"];
    [groupMapping addAttributeMappingsFromArray:@[@"id", @"name"]];
    [groupMapping addRelationshipMappingWithSourceKeyPath:@"users" mapping:userMapping];
    

    最后是下面的 responseDescriptors:

    RKResponseDescriptor *userResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:classMapping pathPattern:@"/api/allthejson" keyPath:@"users" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
    RKResponseDescriptor *groupResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:classMapping pathPattern:@"/api/allthejson" keyPath:@"groups" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
    [objectManager addResponseDescriptorsArray:@[userResponseDescriptor, groupResponseDescriptor]];
    

    然后使用 RKObjectManager 的 getObjectsAtPath:parameters:success:failure 方法获取您的对象,您就完成了!

    【讨论】:

      【解决方案2】:

      RestKit 有很多问题,尤其是在建模关系方面。调试映射可能令人生畏。

      这里有一些代码可以处理你在没有 RestKit 的情况下描述的内容。

      NSArray *userArray; 
      // an array populated with NSManagedObjects 
      // correctly converted from JSON to the User entity
      
      NSArray *groups = [jsonObject objectForKey:@"groups"];
      
      for (NSDictionary *d in groups) {
         Group *g = [NSEntityDescription insertNewObjectForEntityForName:@"Group"
                        inManagedObjectContext:_managedObjectContext];
         g.id = @([d[@"id"] intValue]);
         g.name = d[@"name"];
         NSArray *users = d[@"users"];
         for (NSString *s in users) {
            User *u = [[userArray filteredArrayUsingPredicate:
              [NSPredicate predicateWithFormat:@"id = %@", @([s intValue])]]
                objectAtIndex:0];
            [g addUsersObject:u];
         }
      }
      // save
      

      【讨论】:

      • 谢谢 Mundi ...但是我正在寻找的 RestKit 是不可能实现的吗?在为多对一关系补水时,它似乎工作得很好。我所看到的每一个地方似乎都表明这确实是可能的,但从未记录过如何做到这一点。
      • 这是我对第三方包装器的一般问题。它们不添加任何功能,并且应该让生活更轻松——直到您遇到未记录的问题。这就是为什么我喜欢坚持使用官方 SDK。抱歉,我无法在 RestKit 方面为您提供帮助。
      • 感谢您的帮助蒙迪。我设法使用 RestKit 解决了这个问题,我对结果很满意。
      猜你喜欢
      • 2011-10-14
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2013-06-23
      相关资源
      最近更新 更多