如何在 RestKit 0.20 中实现`hasOne:withMapping:`?

Posted

技术标签:

【中文标题】如何在 RestKit 0.20 中实现`hasOne:withMapping:`?【英文标题】:How to achieve `hasOne:withMapping:` in RestKit 0.20? 【发布时间】:2013-10-21 22:29:13 【问题描述】:

我有一个用于排序项目的 JSON 数据结构


    "id": "8a1a39479d03d959", 
    "sortOrder": 3, 
    "timestamp": 1381669499.11, 

和另一个只有一个项目的文件结构:


    "id": "d88e3c3d1630db4c", 
    "item": "8a1a39479d03d959", 
    "timestamp": 1381669505.364, 
    "version": 2

我一直在努力使这种映射起作用,以至于我将[files] 列表添加到项目 JSON 中只是为了映射关系。但是,阅读较早的post on the Google group,我发现它应该可以像这样映射这些关系(未经测试的代码,只是解释上面的链接):

RKManagedObjectMapping *itemMapping = [RKManagedObjectMapping mappingForClass:[Item class]];
itemMapping.primaryKeyAttribute = @"itemID";
[itemMapping mapKeyPath:@"sortOrder" toAttribute:@"sortOrder"];
[itemMapping mapKeyPath:@"id" toAttribute:@"itemID"];

RKManagedObjectMapping *fileMapping = [RKManagedObjectMapping mappingForClass:[File class]];
fileMapping.primaryKeyAttribute = @"fileID";
[fileMapping mapKeyPath:@"id" toAttribute:@"fileID"];
[fileMapping mapKeyPath:@"item" toAttribute:@"itemID"];
[fileMapping mapKeyPath:@"version" toAttribute:@"version"];

[fileMapping hasOne:@"item" withMapping:itemMapping];
[fileMapping connectRelationship:@"organization" withObjectForPrimaryKeyAttribute:@"itemID"];

但是 hasOne:withMapping: 在 RestKit 0.20 中不再存在。如今,将一对多关系映射到 JSON 中作为简单字符串返回的 id 的正确方法是什么?仅供参考,我在这个项目中使用 CoreData 集成。

【问题讨论】:

请注意,您引用的代码示例来自 0.10.x,而不是 0.2x,因此没有多大意义...您要查找的是 foreign key mapping @Wain 感谢您的编辑。我完全知道代码示例来自 0.10,这正是我问如何在 0.20 中做同样事情的原因! 但是你已经转换了大部分映射,只是你需要帮助的关系? 对不起,我的问题可能有点不清楚。我有一个功能齐全的应用程序,它使用 0.20.2 进行映射,但我已经尝试并失败了很长时间来获取从 FileItem 的映射,而不是从 ItemFile。这是我当前的映射代码:gist.github.com/DaGaMs/7105381 如您所见,我必须在 JSON 中为Items 发送一个“文件”数组,因为这是 RestKit 实际上获取关系映射的唯一方式。我希望获得有关如何从 JSON 中的单个标识符映射到 CoreData 关系的提示 【参考方案1】:

好的,您的映射将项目标识设置为identifier。在文件上,这与任何内容都不对应 - 它需要。添加一个瞬态属性并将item 映射到它(我们称之为itemIdentifier)。现在,您可以设置关系映射来填充核心数据关系(应该是双向的,我假设 item files):

[fileMapping addConnectionForRelationship:@"item" connectedBy:@ @"itemIdentifier": @"identifier" ];

【讨论】:

就是这样!非常感谢,我没有意识到我必须创建一个瞬态属性才能让它工作!【参考方案2】:

试试这个:

RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Item"
                                               inManagedObjectStore:[YourManagedObjectStore];
[mapping addAttributeMappingsFromDictionary:@
                                              @"sortOrder": @"sortOrder",
                                              @"id":@"itemID"
                                              ];

mapping.identificationAttributes = @[@"itemID"];

[mapping addRelationshipMappingWithSourceKeyPath:@"organization"
                                         mapping:fileMapping];

希望对你有帮助。

【讨论】:

有趣,所以你是说如果我有一对多关系Item <----organization---->> File,我必须将关系映射添加到“itemMapping”?我的问题是:如何设置“fileMapping”以便正确设置 Item 和 File 之间的 CoreData 关系? 好的,我刚刚测试了这个;不幸的是,它不起作用,即没有设置关系,而所有其他映射都可以正常工作。 这里使用的关系类型是用于嵌套 JSON(即直接,而不是外键)。

以上是关于如何在 RestKit 0.20 中实现`hasOne:withMapping:`?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 RestKit 0.20 发布到数据库

从 RestKit 0.10 更新到 0.20

在 RestKit 中实现 RKReachabilityObserver 的最佳方法

RestKit 0.20 映射问题

RestKit 0.20:restkit 对象映射使属性映射加倍

使用 RestKit 0.20 初始化核心数据