RestKit 对象映射:如何从键值映射到新对象/关系?
Posted
技术标签:
【中文标题】RestKit 对象映射:如何从键值映射到新对象/关系?【英文标题】:RestKit Object Mapping: How to map from key values to new object / relation? 【发布时间】:2013-11-06 00:33:46 【问题描述】:不确定标题是否最好地描述了问题,如果您有更好的描述,请编辑标题。
所以我正在实施一个处理产品订单的应用程序。在每个订单中,都有“订单项”,即每个产品的订单信息。我们从 REST API 调用中获得的“订单项”的 JSON 数据如下所示:
JSON 数据:
"line_item":
"id":1234, // Product ID
"name":"Cliff Bar",
"sold_price":12.00,
"sold_quantity":25
CoreData 对象(JSON 格式):
"line_item"
"product":
"id":1234,
"name":"Cliff Bar",
"description":"Awesome food",
"inventory_level":12,
"standard_price":11.00
,
"sold_price":12.00,
"sold_quantity":25
如您所见,“id”和“name”更像是所售产品的“标识符”,如果您愿意的话,更像是“主键”。 (CoreData 没有主键的概念,RestKit 有)当我从其余 API 获取 JSON 信息时,出于性能考虑,它实际上“折叠”了 line_item 对象内的产品对象。
问题 1:我应该如何处理?
如果产品不存在,我是否创建具有除“id”和“name”以外的键值的新产品对象?然后,如果需要,我将获取完整的产品对象。这是一个好方法吗?
如果我不创建这些不完整的对象,而只是将 CoreData 对象定义为与 JSON 对象相同。恐怕CoreData中的对象之间没有很强的关系。
如果您有更好的解决方案,请提出建议!
问题 2:
如果问题 1 的答案是肯定的,我如何将 2 个键值(“name”和“id”)映射到一个新创建的对象的字段(“产品”内部的“id”和“name”) line_item”)?我在任何教程中都没有找到这方面的任何信息。
很想听听您将如何解决这个问题。谢谢!
【问题讨论】:
你想映射到什么核心数据模型。设计,然后看看如何构建映射。不要设计映射然后从中创建模型。 【参考方案1】:我不太明白你的问题。但是使用你的 json,如果我是你,我会像这样创建我的核心数据:
-
Line_item:
属性:
sold_price
sold_quantity
关系:
产品
产品
属性:
身份证
姓名
说明
inventory_level
标准价格
关系:
项目
然后我创建 RestKit 映射依赖于此。
RKManagedObjectStore *mos = [RKObjectManager sharedManager].managedObjectStore;
RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Line_item" inManagedObjectStore:mos];
mapping.identificationAttributes = @[@"id"];
[mapping addAttributeMappingsFromArray:@[@"sold_quantity", @"sold_price"]];
[mapping addRelationshipMappingWithSourceKeyPath:@"product" mapping:[Product manageObjectMappingDefinition]];
哦,我意识到我的代码和结构与你的 json 不兼容。
这是一个问题,您如何识别您的 line_item?没有它,我无法设置identificationAttributes
。
【讨论】:
产品由产品 ID 标识。订单项真的没有。这会是个问题吗? @Sullivan 我认为这取决于订单项和产品之间的关系。如果您的产品可能有多个订单项,那将是一个问题。根据 RestKitRKEntityMapping
文档,identificationAttributes
用于在映射期间确定是更新现有对象还是插入新的托管对象
@Putting Wong JSON 中没有任何内容可以用作标识属性。如果我不打算更新 line_item,我只要保持关系清晰就可以了。
@Putting Wong 我需要为 JSON=>MO 和 MO=>JSON 创建 2 个映射吗?
@Sullivan 在我的项目中,我创建了 2 个映射,因为响应和请求不同。结帐RKObjectManager
和Object Mapping - RestKit以上是关于RestKit 对象映射:如何从键值映射到新对象/关系?的主要内容,如果未能解决你的问题,请参考以下文章
RestKit:给定 RKObjectMapping、object.class 和 JSON 字符串,如何获取映射对象?