Чтобы смоделировать это в Базовых данных, вы можете выбрать один из двух подходов:
Используйте пару отношений «многие ко многим», по одному в каждом направлении. Если у сущности Recipe
есть отношение ко многим ingredients
, обратным будет отношение Ingredient
сущности ко многим recipes
.
Используйте промежуточную сущность, подобную 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 сделает это за вас. Это то, что делает Core Data привлекательным по сравнению с непосредственным использованием базы данных.