RestKit – 使用关系映射将单个源映射到多个目的地

Posted

技术标签:

【中文标题】RestKit – 使用关系映射将单个源映射到多个目的地【英文标题】:RestKit – map single source to multiple destinations with relationship mapping 【发布时间】:2013-06-01 00:11:31 【问题描述】:

鉴于以下核心数据关系:

Recipe <<---> Cookbook Recipe <<---> Author Cookbook <<---> Author

这个源 JSON 代表一个配方:


  "id": 123,
  "name": "Recipe Name",
  "author": 
    "id": 456,
    "name": "Author Name"
  ,
  "cookbook": 
    "id": 789,
    "title": "Cookbook Title"
  

我正在寻找一个 RestKit 映射,它会产生一个满足以下条件的配方:

recipe.cookbook IN recipe.author.cookbooks recipe.cookbook.author === recipe.author

这是我目前所拥有的:

recipeMapping = 
  [RKEntityMapping mappingForEntityForName:@"Recipe" inManagedObjectStore:_store];
[recipeMapping addAttributeMappingsFromDictionary:@
   @"id": @"id",
   @"name": @"name"
];
recipeMapping.identificationAttributes = @[@"id"];

RKEntityMapping *authorMapping = 
  [RKEntityMapping mappingForEntityForName:@"Author" inManagedObjectStore:_store];
[authorMapping addAttributeMappingsFromDictionary:@
  @"id": @"id",
  @"name": @"name"
];
authorMapping.identificationAttributes = @[@"id"];

RKEntityMapping *cookbookMapping = 
  [RKEntityMapping mappingForEntityForName:@"Cookbook" inManagedObjectStore:_store];
[cookbookMapping addAttributeMappingsFromDictionary:@
  @"id": @"id",
  @"title": @"title"
];
cookbookMapping.identificationAttributes = @[@"id"];

[recipeMapping 
  addRelationshipMappingWithSourceKeyPath:@"cookbook" 
                                  mapping:cookbookMapping];
[recipeMapping 
  addRelationshipMappingWithSourceKeyPath:@"author" 
                                  mapping:authorMapping];

// Now what?

应用此映射后,recipe.cookbookCookbook 的正确实例,recipe.authorAuthor 的正确实例,但当然 recipe.cookbook.author 为 nil,recipe.author.cookbooks 为空。

【问题讨论】:

【参考方案1】:

由于您没有所需的信息,因此在映射时您无法真正做到这一点。

您可以设置使用外键的关系,而不是使用外键的特殊属性,而是使用 3 个对象之间的关系。我想说这有点脆弱,因为它依赖于映射期间处理关系的顺序。

相反,我会考虑在后处理期间(即在映射完成后的回调中或通过在托管对象子类上实现 willSave)或在您实际需要了解关系时按需执行此操作.这可以使用 KVC 来完成,例如:

如果您执行 fetch 以获取所有作者,您可以为每个作者构建食谱:

author.cookbooks = [author.recipes valueForKeyPath:@"@distinctUnionOfObjects.cookbooks"];

【讨论】:

感谢您的建议!我现在正在后处理步骤中充实关系,但我必须相信在映射中有一种方法可以做到这一点。我能够做的是将recipe.cookbook 映射到recipe.author.cookbooksrecipe.authorrecipe.cookbook.author,但是我的映射不满足我原来问题中的身份要求;这两本食谱和两位作者是托管对象上下文中的不同实体。 好的,你可以让 RestKit 检查具有现有 id 的实体并更新而不是创建新的。您需要在映射上设置“identificationAttributes”。 没有重读...你在使用 RKInMemoryManagedObjectCache 吗? 我使用的是RKFetchRequestManagedObjectCache

以上是关于RestKit – 使用关系映射将单个源映射到多个目的地的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective C 中使用 RestKit 将纬度和经度字段映射到单个 CLLocationCoordinate2D?

RestKit 将未嵌套关系映射到拥有对象

将输出映射到 Restkit 中的核心数据时崩溃

RestKit 一对多关系逆映射

RestKit 2.0 - 将 json 数组映射到实体关系会丢失数组序列

Restkit/Core Data 关系映射,实体到相同类型的实体(父/子)