我在使用RestKit设置一些关系时遇到了最困难的时间。Restkit在嵌套的外键关系中使用@parent
从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
来创建外键关系?或者,还有更好的方法?
喜欢的东西:
@{@"@[email protected]@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是嵌套的,所以你为什么要使用外键映射?你应该直接将映射关系链接起来。 – Wain
我需要能够按地点对项目进行排序,基本上是。我如何将一个3级深的关系链接到最顶层的实体? –
您没有链接到顶部映射的所有关系,它们都是在每个级别创建的。显示要映射到的模型中的实体。 – Wain