来自三个具有多对多关系的实体的FetchRequests,核心数据

时间:2012-03-19 21:55:48

标签: core-data many-to-many nsfetchrequest

在过去的几周里,这个网站对我来说是非常有用的资源,因为我刚刚开始在XCode编码。现在我遇到了一个核心数据问题,我知道如何在一个公共数据库中解决,但不会在Core Data中解决,如果有人能指出我的解决方案,我会很高兴。我可以使用一些关键词进行进一步的研究,所以这就是问题所在:

让我们举一个食谱示例,将食材与食谱联系起来:假设你有一个成分实体,每个都可以出现在几个食谱中,你有一个食谱实体,每个食谱都有一个名称,包含几种成分。什么是最好的数据模型?

我所做的是引入第三个表格,将食谱名称与成分联系起来,因此它只包含两个指向成分实体和配方实体的关系(两者兼有)。但是我现在如何获取给定食谱的成分呢?

我可能需要使用获取请求,但我需要在获取中执行两个步骤 - 基本上说“获取与翻译实体中与我当前配方相关的对象相关的所有成分实体实例” ......有什么想法吗?

谢谢你们!

1 个答案:

答案 0 :(得分:0)

要在Core Data中对此进行建模,您可以采用以下两种方法之一:

  1. 使用一对多对关系,每个方向一个。如果Recipe实体具有多对多ingredients关系,则其反之为Ingredient实体与多个recipes关系。

  2. 使用像RecipeIngredient这样的中间实体,就像您似乎已经完成的那样。 RecipeIngredient都可以与RecipeIngredient建立多对多关系,但每个关系的倒数可以为一。

  3. 无论您使用哪种方法,您仍然只需要一次获取请求。假设您想要获得名为“布朗尼”的食谱的成分。您将为实体Recipe创建获取请求,并使用选择name like "Brownies"的谓词。这将为您提供与请求匹配的一组食谱。然后,您可以使用关系访问任何这些食谱的成分 - 也就是说,您不需要另一个成分的获取请求。假设您采用了第二种方法,并且Recipe与名为RecipeIngredients的{​​{1}}具有多对多关系,而ingredientList具有RecipeIngredient的一对一关系:

    ingredient

    如果你改为使用第一种方法,你可以直接访问这些成分:

    Recipe *recipe = [recipes anyObject];
    NSSet *ingredientList = recipe.ingredientList;
    for (RecipeIngredient *item in ingredientList) {
        Ingredient *ingredient = item.ingredient;
        //...do something with the ingredient...
    }
    

    无论哪种方式,重点是一旦从Core Data存储中提取了一个对象,就不需要再进行任何提取来获取相关数据。核心数据将在幕后为您完成。与直接使用数据库相比,这是使核心数据更具吸引力的因素之一。