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.cookbook
是 Cookbook
的正确实例,recipe.author
是 Author
的正确实例,但当然 recipe.cookbook.author
为 nil,recipe.author.cookbooks
为空。
【问题讨论】:
【参考方案1】:由于您没有所需的信息,因此在映射时您无法真正做到这一点。
您可以设置使用外键的关系,而不是使用外键的特殊属性,而是使用 3 个对象之间的关系。我想说这有点脆弱,因为它依赖于映射期间处理关系的顺序。
相反,我会考虑在后处理期间(即在映射完成后的回调中或通过在托管对象子类上实现 willSave
)或在您实际需要了解关系时按需执行此操作.这可以使用 KVC 来完成,例如:
如果您执行 fetch 以获取所有作者,您可以为每个作者构建食谱:
author.cookbooks = [author.recipes valueForKeyPath:@"@distinctUnionOfObjects.cookbooks"];
【讨论】:
感谢您的建议!我现在正在后处理步骤中充实关系,但我必须相信在映射中有一种方法可以做到这一点。我能够做的是将recipe.cookbook
映射到recipe.author.cookbooks
和recipe.author
到recipe.cookbook.author
,但是我的映射不满足我原来问题中的身份要求;这两本食谱和两位作者是托管对象上下文中的不同实体。
好的,你可以让 RestKit 检查具有现有 id 的实体并更新而不是创建新的。您需要在映射上设置“identificationAttributes”。
没有重读...你在使用 RKInMemoryManagedObjectCache 吗?
我使用的是RKFetchRequestManagedObjectCache
。以上是关于RestKit – 使用关系映射将单个源映射到多个目的地的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Objective C 中使用 RestKit 将纬度和经度字段映射到单个 CLLocationCoordinate2D?