CoreData 多对多关系

Posted

技术标签:

【中文标题】CoreData 多对多关系【英文标题】:CoreData many-to-many relationship 【发布时间】:2013-02-20 06:34:29 【问题描述】:

CoreData中如何操作多对多关系? 例如:

我有 2 个实体 - 食谱和配料

CoreData 像食谱> 成分一样链接它们。 现在我需要为配方中的每个成分添加属性“计数”。我该怎么做?

谢谢

【问题讨论】:

“我需要为每种成分添加属性“计数”是什么意思?这是否意味着您要添加新的 NSAttributeDescription 或只是使用新值更新此属性? @MarkKryzhanouski 食谱有 3 列:名称、拇指图像、成分成分有 2 列:名称、食谱 Recipe.ingredients > Ingredients.recipe 现在我需要添加“计数”列(某些配方中某些成分的计数) 【参考方案1】:

Core Data 会为您维护对象图的一致性。因此,如果您使用 SQLite 存储,Core Data 会自动为您创建多对多关系的中间连接表。在您的情况下,您应该显式创建一个中间(“join”)实体。中间实体的一个优点是您还可以使用它向 关系——例如,“IngredientInfo”实体可能包含“计数”列。所以你的模型应该看起来像:Recipe > IngredientInfo Ingredient

如果您在这里发现不清楚的地方,我会更新答案。

更新:访问成分和计数

    for (IngredientInfo* ingredientInfo in recipe.ingredientInfos) 
        Ingredient* ingredient = ingredientInfo.ingredient;
        NSNumber* count = ingredientInfo.count;
    

或使用 KVC 快速访问某些配方中的所有成分

NSSet* ingredients = [recipe valueForKeyPath:@"ingredientInfo.ingredient"];

【讨论】:

我认为应该是IngredientInfo <<--> Ingredient,否则你只能将一种成分用于一个食谱。 @Mark 谢谢!这是我需要的 @Mark 当我选择一些食谱时,我应该如何获取配料集及其数量? @MarkKryzhanouski 如果我不创建成分信息,那么有什么方法可以从双方更新实体吗? @msmq 如果您不自己创建中间连接表,那么只需在 CoreData 中具有相应名称成分/食谱的配方 > 成分实体之间建立多对多关系模型构建器和通过双方的关系属性访问。例如 recipe.ingredients 或 ingredients.recipes。希望它清楚。

以上是关于CoreData 多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

保存循环删除多对多CoreData关系的一端

CoreData:使用 NSPredicate 过滤一对多对多关系(此处不允许错误对多键)

CoreData:如何建模循环多对多关系

CoreData:查询一对多对多的关系

CoreData :NSFetchedResultsController 一对多对多的关系

CoreData 性能:基于多对多关系