I have an API with two endpoints:
/projects
{
project_list:[{"project_id": 1, "project_name": "Ben"},
{"project_id": 2, "project_name": "Jerry"}]
}
/projects/1/members
{
member_list:[{"member_id": 1, "member_name": "Ben"},
{"member_id": 2, "member_name": "Jerry"}]
}
A project has-many members and a member has-one project. I'm using RestKit 0.20.1 to map these to a Core Data store.
Current code:
// ###############################
// ## Configure Project mapping ##
// ###############################
RKEntityMapping *projectMapping = [RKEntityMapping mappingForEntityForName:@"Project" inManagedObjectStore:managedObjectStore];
projectMapping.identificationAttributes = @[ @"projectId" ];
[projectMapping addAttributeMappingsFromDictionary:@{ @"project_id": @"projectId",
@"project_name": @"projectName"}];
RKResponseDescriptor *projectDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:projectMapping pathPattern:nil keyPath:@"project_list" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[manager addResponseDescriptorsFromArray:@[ projectDescriptor ]];
// ##############################
// ## Configure Member mapping ##
// ##############################
RKEntityMapping *memberMapping = [RKEntityMapping mappingForEntityForName:@"Member" inManagedObjectStore:managedObjectStore];
memberMapping.identificationAttributes = @[ @"memberId" ];
[memberMapping addAttributeMappingsFromDictionary:@{ @"member_id": @"memberId",
@"member_name": @"memberName"}];
RKResponseDescriptor *memberDescriptior = [RKResponseDescriptor responseDescriptorWithMapping:memberMapping pathPattern:nil keyPath:@"member_list" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[manager addResponseDescriptorsFromArray:@[ memberDescriptor ]];
The closest I've come are these examples: http://restkit.org/api/latest/Classes/RKConnectionDescription.html, but they depend on the foreign key being in the JSON response.
How do I connect these when the project foreign key is in the URL and not returned in the JSON data when retrieving the members?
You can use the foreign key as described in the reference you link, you just need to get it...
To get it, you need to use a path pattern and metadata mapping. You also want to use RKRoute
as it does a lot of the work with path patterns.
Define your path pattern like:
projects/:identity/members
And then in your mapping you can define the foreign key to pick this up:
@"@metadata.routing.parameters.identity": @"foreignKey",
See the 'Metadata Mapping' section of the RKObjectManager docs.
来源:https://stackoverflow.com/questions/16734694/restkit-core-data-mapping-connection-with-foreign-key-in-the-url