【问题标题】:Foreign key relationship mapping with RestKit与 RestKit 的外键关系映射
【发布时间】:2013-06-23 22:44:12
【问题描述】:

我对 RestKit 完全陌生,并且有些挣扎。

JSON:

{
    "teams": [
        {
            "id": 1,
            "name": "Team A"
        },
        {
            "id": 2,
            "name": "Team B"
        }
    ],
    "users": [
        {
            "id": 1,
            "name": "cameron",
            "teamId": 1
        },
        {
            "id": 2,
            "name": "paul",
            "teamId": 2
        }
    ]
}

核心数据:

@interface Team : NSManagedObject
@property (nonatomic, retain) NSNumber * teamId;
@property (nonatomic, retain) NSString * name;
@end




@interface User : NSManagedObject
@property (nonatomic, retain) NSNumber * userId;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) Team * team;
@end

我的应用程序逻辑如下所示:

// team mapping
RKEntityMapping *teamMapping = [RKEntityMapping mappingForEntityForName:@"Team" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
teamMapping.identificationAttributes = @[@"teamId"];
[teamMapping addAttributeMappingsFromDictionary:@{
 @"id": @"teamId",
 @"name": @"name"
 }];


// Register our mappings with the provider
RKResponseDescriptor *teamResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:teamMapping
                                                                                   pathPattern:nil
                                                                                       keyPath:@"teams"
                                                                                   statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[self.objectManager addResponseDescriptor:teamResponseDescriptor];



// user mapping
RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
userMapping.identificationAttributes = @[@"userId"];
[userMapping addAttributeMappingsFromDictionary:@{
 @"id": @"userId",
 @"name": @"name"
 }];


// Register our mappings with the provider
RKResponseDescriptor *userResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:userMapping
                                                                                   pathPattern:nil
                                                                                       keyPath:@"users"
                                                                                   statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[self.objectManager addResponseDescriptor:userResponseDescriptor];

我一生都无法弄清楚如何让 RestKit 填充用户对象的团队属性。

我看了这么多帖子,但我尝试的都没有,这不是一个常见的用例吗?

有人知道怎么做吗,非常感谢帮助!

谢谢。

【问题讨论】:

  • 希望这个链接对你有帮助stackoverflow.com/a/15607217/2261595>

标签: ios json restkit restkit-0.20


【解决方案1】:

您需要向您的 User 实体添加一个临时属性,该实体包含关联的 teamId。这需要添加到您的userMapping

然后,您需要将关系定义添加到您的userMapping

[userMapping addConnectionForRelationship:@"team" connectedBy:@{ @"teamId": @"teamId" }];

这为 RestKit 提供了建立连接所需的信息,并指示它建立连接作为映射操作的一部分。

【讨论】:

  • 我面临着非常相似的情况,我想知道 RestKit 在解析 User 时会做什么,并且该用户的 teamId 不存在 Team:它会将关系保留为零?它会创建一个新团队并仅使用 teamId 值填充它吗?后者有什么办法吗?
  • @veducm 以保证创建存根对象,您可能需要第二个响应描述符,它将键路径导航到 ids(因为第一个响应描述符需要将 ids 复制到另一个对象)。
  • 谢谢!所以我知道这种关系将保留为nil。另一方面,我不知道如何做第二个响应描述符......你知道我在哪里可以看到一些示例代码,阅读它或找到任何关于如何做到这一点的提示吗?
  • 没有具体例子。它只是一个普通的响应描述符,但对关键路径非常有选择性。外键映射是在基本映射 IIRC 之后完成的。尝试创建响应描述符并在遇到问题时提出问题。
  • @Wain 有两个问题:1)我缺少几个对象的响应描述符,2)我正在映射 RestKit 没有的多对多链接对象的两侧好像很喜欢。一旦我注释掉 addConnectionForRelationship:connectedBy:@{"arrayOfIds": "objectId"} 并为关系的另一方留下定义,我很高兴。
猜你喜欢
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多