我有一个使用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中。