RestKit - 发布或放置包含嵌套实体的实体

Posted

技术标签:

【中文标题】RestKit - 发布或放置包含嵌套实体的实体【英文标题】:RestKit - Post or Put an entity containing nested entities 【发布时间】:2014-05-12 20:30:22 【问题描述】:

我有一个 ios 应用程序,它使用 RestKit 在我的 Core Data 模型和 Rails API 之间进行同步。

我的Core Data model 中有游戏和团队实体。游戏与团队有一对多的关系。我正在尝试更新 Teams 的“score”属性,然后尝试通过发送 Game 在我的 RKObjectManager 上运行 putObject 方法。战队的分数不会在服务器上更新。

如果我更改游戏的属性,例如'state',然后用 putObject 发送 Game,它就可以正常工作了。

如果对象内部有嵌套对象,是否可以使用 putObject 更新多个对象?或者当我更新它的'score'属性时,我是否需要在 Team 上运行 putObject?

这是我的游戏映射代码。

Class itemClass = [Game class];
RKEntityMapping *mapping = [RKEntityMapping
                            mappingForEntityForName:@"Game"
                            inManagedObjectStore:managedObjectStore];

mapping.identificationAttributes = @[@"gameID"];

NSDictionary *standardDict = @@"id": @"gameID",
                               @"created_at": @"createdAt",
                               @"updated_at": @"updatedAt";

NSDictionary *gameDict = @@"league_id": @"leagueID",
                          @"location_id": @"locationID",
                          @"state": @"state",
                          //.... more attributes....
                          ;

[mapping addAttributeMappingsFromDictionary:standardDict];
[mapping addAttributeMappingsFromDictionary:gameDict];

[mapping addConnectionForRelationship:@"league" connectedBy:@@"leagueID": @"leagueID"];
[mapping addConnectionForRelationship:@"location" connectedBy:@@"locationID": @"locationID"];


NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
NSString *keyPath = nil;
NSString *itemsPath = @"games/:gameID";
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping
                                                                                        method:RKRequestMethodAny
                                                                                   pathPattern:itemsPath
                                                                                       keyPath:keyPath
                                                                                   statusCodes:statusCodes];

[manager addResponseDescriptor:responseDescriptor];

NSString *itemPath = @"game";
RKEntityMapping *requestMapping = [mapping inverseMapping];
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping
                                                                               objectClass:itemClass
                                                                               rootKeyPath:itemPath
                                                                                    method:RKRequestMethodAny];
[manager addRequestDescriptor:requestDescriptor];

//route for manipulating with existing object
RKRoute *itemRoute = [RKRoute routeWithClass:itemClass pathPattern:@"games/:gameID" method:RKRequestMethodAny];
itemRoute.shouldEscapePath = YES;

[manager.router.routeSet addRoutes:@[itemRoute]];

团队的映射基本上以完全相同的方式编写,除了团队根据游戏的“游戏 ID”连接到游戏。所以 --> [mapping addConnectionForRelationship:@"game" connectedBy:@@"gameID": @"gameID"];

【问题讨论】:

【参考方案1】:

您在响应映射上使用外键映射:

[mapping addConnectionForRelationship:@"league" connectedBy:@@"leagueID": @"leagueID"];
[mapping addConnectionForRelationship:@"location" connectedBy:@@"locationID": @"locationID"];

当您使用 inverseMapping 时,这些不会被反转(因为它们没有包含足够的信息来创建反转)。

因此,您的requestMapping 需要显式更新以包含关系映射,以告知 RestKit 处理关系以及如何将关系内容映射到生成的 JSON。

【讨论】:

所以你是说我的requestMapping 需要更新以包含LeagueLocation 的“反向”关系?或者你是说我的requestMapping 需要更新以在我的Game 中包含与Teams 的关系?如果是后者,那会是什么样子?我想像[requestMapping addConnectionForRelationship:@"teams" connectedBy:@@"??": @"??"]; 这样的东西但是connectedBy 参数是什么? 无论您想发送哪种关系。你不能用addConnectionForRelationship,用addRelationship 我看到的唯一可以在requestMapping 上使用的方法是addRelationshipMappingWithSourceKeyPath:mapping: ...这是我要找的吗? 是的(它使用映射所以可以直接应用,不像外键连接) 对于响应描述符,源是 JSON 中的键,对于请求,源是数据模型(团队)中的键。目标键是要放入 JSON 的内容。映射是如何处理关系内容。

以上是关于RestKit - 发布或放置包含嵌套实体的实体的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 实体映射

Restkit/CoreData - 更新实体的属性不会更新 UITableView

Restkit嵌套对象映射问题

RestKit 2.0 - 将 json 数组映射到实体关系会丢失数组序列

我可以防止 RestKit+CoreData 覆盖本地实体更改吗?

RestKit 0.20:映射复杂的动态嵌套 JSON