CoreData,多对多关系和NSPredicate

3
我有一个包含多对多关系的CoreData数据模型。事实证明,NSPredicate不支持多对多关系。根据CoreData.pdf中的描述:“在谓词中,您只能有一个一对多的元素。”
举个食谱的例子:有许多食谱和许多配料。一个食谱可以有许多配料,“盐”可能是其中之一,而“盐”也用于许多食谱中。这是自然的多对多关系。
有哪些建议的解决方法?
是CoreData不好的想法,我应该回到SQLite吗?

1
许多食谱中都含有“盐”这个调料,而且“盐”也广泛被用于许多食谱中。 - just somebody
考虑一个食谱实体和一个成分实体。有许多食谱,其中许多具有相同的成分。有许多成分用于许多食谱。这不是同一件事。需要在成分实体中仅有一个盐成分实例。还需要找到食谱中的所有成分。希望找到使用盐的所有食谱。这是一种多对多关系。这样的关系实际上是通过一个中间表来创建的,CoreData可以实现。 - zaph
我已经更正了问题,将其改为“一个食谱可以有很多配料……”,这显然是预期的例子。 - Duncan Babbage
2个回答

5
我的理解是,通过添加一个中间实体,您可以将任何多对多关系转换为单独的一对多关系。
你有:
食谱拥有多个成分。 成分拥有多个食谱。
创建一个新的RecipeIngredient实体,使得:
食谱拥有多个RecipeIngredients。 成分拥有多个RecipeIngredients。 一个RecipeIngredient有一个食谱和一个成分。

是的,基本上这就是我决定要做的。CoreData会创建中间表,只是不能在NSPredicate中使用它。 - zaph
但是如果您创建中间实体,那么您可以使用它与NSPredicate。通常,最好创建一个满足您需求的模型,让Core Data处理细节,而不是担心Core Data如何在SQLite中实现您的模型。 - gerry3
我不太敢反驳一个拥有8,017声望值的人,但是gerry3...的建议听起来像是一个巨大的修补措施,因此是糟糕的建议。我建议读者查看这个带有不同建议的线程 - Duncan Babbage
@Duncan Babbage 通常情况下,显式地为“连接表”创建实体是很常见的,也可能是必需的。例如,如果您想要在RecipeIngredients上存储数据(例如使用多少盐),那么这样做是有意义的。如果您对此问题有更好的答案,请添加并开始赚取投票。 - gerry3
太棒了 - 非常感谢你。 - Ríomhaire

1
这个问题实际上让我在遇到一个问题时走了一条错误的路。事实证明,您可以使用谓词查询多对多关系。只是不能向下进一步查询,比如 A <<-->> B <<-->> C
我在一个具有Story <<-->> Team模型中使用的谓词是这样的...
[NSPredicate predicateWithFormat:@"SUBQUERY( teams, $t, $t IN %@ ).@count > 0", teams)];

这个谓词用于针对故事实体的获取请求。第二个“teams”是我正在寻找关于团队的故事的集合或数组。SUBQUERY格式有点令人困惑,所以我会注意到它可以被理解为:“对于当前故事的团队集合中的每个团队t,查看它是否在这个其他集合(teams)中。”希望这可以帮助你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接