我有一个使用RestKit在我的核心数据模型和Rails API之间进行同步的iOS应用。

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

如果我更改游戏的属性,例如状态”,然后使用putObject发送游戏,它可以正常工作。

如果对象内部有嵌套对象,是否可以用putObject更新多个对象?还是在更新其“得分”属性时需要在团队中运行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]];


团队的映射基本上以完全相同的方式编写,只是团队基于游戏的“ gameID”与游戏建立了连接。所以-> [mapping addConnectionForRelationship:@"game" connectedBy:@{@"gameID": @"gameID"}];

最佳答案

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

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


并且当您使用inverseMapping时,这些不会反转(因为它们包含的信息不足以创建反函数)。

因此,您的requestMapping需要进行显式更新以包括一个关系映射,以告诉RestKit处理该关系以及如何将关系内容映射到生成的JSON中。

09-13 03:02