来自具有多对多关系的三个实体的FetchRequests,核心数据
这个网站在过去的几周里对我来说是非常有用的资源,因为我刚刚开始在XCode中编写代码。现在我遇到了一个核心数据问题,我知道如何在通用数据库中解决这个问题,但不是在核心数据中,如果有人能指出我的解决方案,我会很高兴。我可以用一些关键字来做进一步的研究,所以这里是问题:来自具有多对多关系的三个实体的FetchRequests,核心数据
让我们拿一个食谱的例子,将成分链接到食谱:假设你有一个成分的实体,每个成分都可以发生在几个食谱中,而且你有一个食谱实体,每个食谱都有一个名称并包含多种成分。什么是最好的数据模型?
我做的是引入第三个表,它将食谱名称与成分链接起来,所以它只是由两个关系(包括对多)指向成分实体和食谱实体组成。但是,我现在怎样才能获取给定配方的配料?
可能我需要使用Fetch Request,但是我需要在抓取过程中做两个步骤 - 基本上说“抓取与我当前食谱相关的翻译实体中的对象相关的成分实体的所有实例“... 有任何想法吗?
谢谢你们!
要在核心数据模型,您可以采取以下两种方法:
使用一对一对多的关系,每个方向的。如果
Recipe
实体具有多对多关系,则其倒数将是实体的多对多关系。使用类似
RecipeIngredient
这样的中间实体,就像您似乎完成的那样。Recipe
和Ingredient
都可以与RecipeIngredient
有多对多的关系,但每个关系的倒数可以是一对一的。
无论使用哪种方法,您仍然只需要一个提取请求。假设你想获得名为“布朗尼”的食谱的配料。您将为实体Recipe
创建一个提取请求,并使用选择name like "Brownies"
的谓词。这会为您提供符合请求的一系列食谱。然后,您可以使用关系访问任何这些食谱的原料 - 也就是说,您不需要对原料进行另一次获取请求。假设你把第二个方法和Recipe
具有一对多的关系RecipeIngredients
叫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...
}
如果改为使用第一种方法,你可以访问多一点直接设置配料:
Recipe *recipe = [recipes anyObject];
NSSet *ingredients = recipe.ingredients;
for (Ingredient *ingredient in ingredients) {
//...do something with the ingredient...
}
无论哪种方式,关键是,一旦你从你的核心数据存储中提取一个对象,你不需要做任何更多的读取以获得相关数据。核心数据将为您在幕后做到这一点。与直接使用数据库相比,这是使Core Data引人注目的事情之一。
嘿Caleb,非常感谢您的回答,非常详细,正是我所需要的。我想我会选择你提出的模型,因为这完全有道理,而我的想法来自数据库 - 我猜想的是这种想法。再次感谢! :) – Dan 2012-03-20 21:15:12