Ios RestKit对象映射:如何从键值映射到新对象/关系?
不确定标题是否最能描述问题,如果您有更好的描述,请编辑标题 因此,我正在实现一个处理产品订单的应用程序。在每个订单中,都有“行项目”,即每个产品的订单信息。我们从REST API调用中获得的“行项”的JSON数据如下所示: JSON数据:Ios RestKit对象映射:如何从键值映射到新对象/关系?,ios,json,core-data,restkit,restkit-0.20,Ios,Json,Core Data,Restkit,Restkit 0.20,不确定标题是否最能描述问题,如果您有更好的描述,请编辑标题 因此,我正在实现一个处理产品订单的应用程序。在每个订单中,都有“行项目”,即每个产品的订单信息。我们从REST API调用中获得的“行项”的JSON数据如下所示: JSON数据: "line_item":{ "id":1234, // Product ID "name":"Cliff Bar", "sold_price":12.00, "sold_quantity":25 } CoreData对象(JSON格式
"line_item":{
"id":1234, // Product ID
"name":"Cliff Bar",
"sold_price":12.00,
"sold_quantity":25
}
CoreData对象(JSON格式):
正如您所看到的,“id”和“name”更像是所销售产品的“标识符”,如果您愿意,可以称为“主键”。(CoreData没有主键的概念,RestKit有点像)当我从restapi获取JSON信息时,出于性能考虑,它实际上“折叠”了line_item对象中的product对象
问题1:我应该如何处理
如果产品不存在,是否使用除“id”和“name”null以外的键值创建新的产品对象?然后,如果需要,我将获取完整的产品对象。这是一个好方法吗
如果我不创建这些不完整的对象,只保留定义的CoreData对象与JSON对象相同。恐怕CoreData中的对象之间没有很强的关系
如果你有更好的解决方案,建议一个
问题2:
如果问题1的答案是肯定的,我如何将两个键值(“名称”和“id”)映射到一个新创建的对象的字段(“行_项”内的“产品”的“id”和“名称”)?我在任何教程中都没有找到关于这方面的任何信息
我很想听听你是如何解决这个问题的。谢谢 我不太明白你的问题。但使用json,如果我是你,我会创建如下核心数据:
- 属性:
- 售价
- 销售数量
- 关系:
- 产品
- 属性:
- 身份证
- 名字
- 描述
- 库存水平
- 标准价格
- 关系:
- 项目
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不兼容
问题是,你如何识别你的商品?没有它,我无法设置
identificationAttributes
要映射到的核心数据模型。设计,然后查看如何构建映射。不要设计映射,然后根据该映射创建模型。产品由产品id标识。行项目实际上没有。。这可能是个问题吗?@Sullivan我认为这取决于商品和产品之间的关系。如果您的产品可能有多个行项目,这将是一个问题。根据RestKitRKEntityMapping
文档,在映射过程中使用IdentificationAttribute
来确定是应该更新现有对象还是应该更新新的托管对象inserted@Putting在JSON中没有任何东西可以用作标识属性。如果我不打算更新第_行项目,保持关系清晰可能没问题。@我需要为JSON=>MO和MO=>JSON创建两个映射吗?@Sullivan在我的项目中,我创建了两个映射,因为响应和请求不同。签出对象管理器和
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]];