2014-01-19 11 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

我試圖避免在謂詞中跨越多個關係的可能性能問題,但我認爲你是對的。我會這樣做。 –