Restkit 在嵌套的外键关系中使用 @parent

Posted

技术标签:

【中文标题】Restkit 在嵌套的外键关系中使用 @parent【英文标题】:Restkit use @parent in nested Foreign Key relationship 【发布时间】:2014-01-19 05:19:19 【问题描述】:

我很难用 RestKit 建立一些关系。

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 来创建外键关系?还是有更好的办法?

类似:

@@"@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 级深度关系链接到最顶层的实体? 您没有链接到顶部映射的所有关系,它们是在每个级别创建的。显示您要映射到的模型中的实体。 我添加了映射的所有代码。 【参考方案1】:

只是不要做你想做的事。您的映射看起来不错,并且假设您在模型中配置了反向关系,您只需从项目实体导航关系即可到达关联的场所实体。

也就是说,我认为 @parent.id 引用应该可以使连接成为可能(通过授予对 id 的访问权限)。但同样,真的不需要。您可以通过模型获取和谓词,以获取所需的任何信息以及您拥有的关系。

【讨论】:

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

以上是关于Restkit 在嵌套的外键关系中使用 @parent的主要内容,如果未能解决你的问题,请参考以下文章

两个端点结果之间的外键映射 RESTKIT Core Data

如何在laravel中获取嵌套关系的数据

如何递归加载RestKit中由外键标识的嵌套对象?

RestKit:用于 2 个具有关系的实体的不同 API

Restkit:当外键设置为 null 时,Core Data 中的关系不会重置

Restkit:外键关系的存根