【发布时间】:2014-01-19 05:19:19
【问题描述】:
我很难用 RestKit 建立一些关系。
从item 到venue 存在一对多关系,但通过多个级别的关系。
以下是 JSON 结构的概要:
{
"id": 1,
"name": "Venue Name",
"sections": [
{
"id": 1,
"name": "Paper",
"categories": [
{
"id": 1,
"name": "Paper Goods",
"items": [
{
"venue" : 1
// Other data goes here
}
}
}
}
我正在尝试将venue 外键连接到Venue 的id 属性。
我已尝试执行以下操作:
NSEntityDescription * itemEntity = [NSEntityDescription entityForName:@"DSItem" inManagedObjectContext:managedObjectStore.mainQueueManagedObjectContext];
NSRelationshipDescription * venueRel = [itemEntity relationshipsByName][@"venue"];
RKConnectionDescription * connection = [[RKConnectionDescription alloc] initWithRelationship:venueRel attributes:@{@"venue" : @"pk"}]; // id --> pk on DSVenue class
但是在对象映射之后场地属性为零。
如何使用@parent 来创建外键关系?还是有更好的办法?
类似:
@{@"@parent.@parent.@parent.pk" : @"venue"}
我看过 this SO 问题,但它似乎适用于将属性链接到父属性,而不是将外键链接到实体。
任何帮助将不胜感激!
编辑:这是所有映射代码
RKEntityMapping *itemMapping = [RKEntityMapping mappingForEntityForName:@"DSItem" inManagedObjectStore:managedObjectStore];
itemMapping.identificationAttributes = [DSItem identificationAttributes];
[itemMapping addAttributeMappingsFromDictionary:[DSItem attributeMappings]];
NSEntityDescription * itemEntity = [NSEntityDescription entityForName:@"DSItem" inManagedObjectContext:managedObjectStore.mainQueueManagedObjectContext];
NSRelationshipDescription * venueRel = [itemEntity relationshipsByName][@"venue"];
RKConnectionDescription * connection = [[RKConnectionDescription alloc] initWithRelationship:venueRel keyPath:@"venue"];
[itemMapping addConnection:connection];
RKEntityMapping *categoryMapping = [RKEntityMapping mappingForEntityForName:@"DSCategory" inManagedObjectStore:managedObjectStore];
categoryMapping.identificationAttributes = [DSCategory identificationAttributes];
[categoryMapping addAttributeMappingsFromDictionary:[DSCategory attributeMappings]];
[categoryMapping addRelationshipMappingWithSourceKeyPath:@"items" mapping:itemMapping];
RKEntityMapping *sectionMapping = [RKEntityMapping mappingForEntityForName:@"DSSection" inManagedObjectStore:managedObjectStore];
sectionMapping.identificationAttributes = [DSSection identificationAttributes];
[sectionMapping addAttributeMappingsFromDictionary:[DSSection attributeMappings]];
[sectionMapping addRelationshipMappingWithSourceKeyPath:@"categories" mapping:categoryMapping];
RKEntityMapping *venueMapping = [RKEntityMapping mappingForEntityForName:@"DSVenue" inManagedObjectStore:managedObjectStore];
[venueMapping addAttributeMappingsFromDictionary:[DSVenue attributeMappings]];
venueMapping.identificationAttributes = [DSVenue identificationAttributes];
[venueMapping addRelationshipMappingWithSourceKeyPath:@"sections" mapping:sectionMapping];
RKResponseDescriptor *venueDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:venueMapping
method:RKRequestMethodGET
pathPattern:[DSVenue pathPattern]
keyPath:[DSVenue keyPath]
statusCodes:successIndexSet];
RKResponseDescriptor *itemDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:itemMapping
method:RKRequestMethodGET
pathPattern:[DSItem pathPattern]
keyPath:[DSItem keyPath]
statusCodes:successIndexSet];
[manager addResponseDescriptorsFromArray:@[itemDescriptor, venueDescriptor]];
【问题讨论】:
-
您的 JSON 是嵌套的,那么您为什么要尝试使用外键映射?您应该直接将映射与关系链接起来。
-
基本上,我需要能够按场地对项目进行排序。如何将 3 级深度关系链接到最顶层的实体?
-
您没有链接到顶部映射的所有关系,它们是在每个级别创建的。显示您要映射到的模型中的实体。
-
我添加了映射的所有代码。
标签: ios json restkit restkit-0.20