Ios RestKit对象映射:如何从键值映射到新对象/关系?

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格式

不确定标题是否最能描述问题,如果您有更好的描述,请编辑标题

因此,我正在实现一个处理产品订单的应用程序。在每个订单中,都有“行项目”,即每个产品的订单信息。我们从REST API调用中获得的“行项”的JSON数据如下所示:

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,如果我是你,我会创建如下核心数据:

  • 第u行项目:
    • 属性:
      • 售价
      • 销售数量
    • 关系:
      • 产品
  • 产品
    • 属性:
      • 身份证
      • 名字
      • 描述
      • 库存水平
      • 标准价格
    • 关系:
      • 项目
  • 然后我创建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不兼容


    问题是,你如何识别你的商品?没有它,我无法设置
    identificationAttributes

    要映射到的核心数据模型。设计,然后查看如何构建映射。不要设计映射,然后根据该映射创建模型。产品由产品id标识。行项目实际上没有。。这可能是个问题吗?@Sullivan我认为这取决于商品和产品之间的关系。如果您的产品可能有多个行项目,这将是一个问题。根据RestKit
    RKEntityMapping
    文档,在映射过程中使用
    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]];