如何在 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 进行映射,但我已经尝试并失败了很长时间来获取从 File
到 Item
的映射,而不是从 Item
到 File
。这是我当前的映射代码: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 中实现 RKReachabilityObserver 的最佳方法