2014-01-19 22 views
0

我在使用RestKit设置一些关系时遇到了最困难的时间。Restkit在嵌套的外键关系中使用@parent

itemvenue有一个一对多的关系,但是通过多层次的关系图。

这里的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外键的Venueid属性。

我曾尝试做如下:

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]]; 
+0

你的JSON是嵌套的,所以你为什么要使用外键映射?你应该直接将映射关系链接起来。 – Wain

+0

我需要能够按地点对项目进行排序,基本上是。我如何将一个3级深的关系链接到最顶层的实体? –

+0

您没有链接到顶部映射的所有关系,它们都是在每个级别创建的。显示要映射到的模型中的实体。 – Wain

回答

1

干脆不要做你想要做的事。您的映射看起来很好,并且假设您在模型中配置了相反的关系,则只需从项目实体导航到关联的场地实体即可。

这就是说,我认为@parent.id参考应该工作,使连接成为可能(通过提供访问ID)。但是,再次,真的不需要。您可以在模型上获取和预测,以获得您需要的任何信息。

+0

我试图避免在谓词中跨越多个关系的可能性能问题,但我认为你是对的。我会这样做。 –