FetchRequests от трех сущностей со связями ко многим, Core Data - PullRequest
1 голос
/ 20 марта 2012

этот сайт был чрезвычайно полезным ресурсом для меня в последние недели, так как я только начал программировать в XCode.Теперь я столкнулся с проблемой Core Data, которую я знал бы, как решить в общей базе данных, но не в Core Data, и я был бы рад, если бы кто-то мог указать мне на решение.Я бы хорошо с некоторыми ключевыми словами, чтобы провести дальнейшее исследование, поэтому вот проблема:

Давайте возьмем пример рецепта, связывая ингредиенты с рецептами: скажем, у вас есть набор ингредиентов, каждый из которых может происходить внесколько рецептов, и у вас есть сущность рецептов, каждый из которых имеет название и содержит несколько ингредиентов.Какова лучшая модель данных для этого?

Что я сделал, так это представил третью таблицу, которая связывает названия рецептов с ингредиентами, так что она просто состоит из двух отношений (оба ко многим), указывающих на сущность ингредиента.и по рецептуре сущности.Но как я могу получить ингредиенты для данного рецепта сейчас?

Вероятно, мне нужно использовать запрос на выборку, но мне нужно сделать два шага при получении - в основном сказать: «Получить все экземпляры сущностей ингредиентов, которые связаны между собой».к объектам в объекте перевода, которые связаны с моим текущим рецептом "... есть идеи?

Спасибо, ребята!

1 Ответ

0 голосов
/ 20 марта 2012

Чтобы смоделировать это в Базовых данных, вы можете выбрать один из двух подходов:

  1. Используйте пару отношений «многие ко многим», по одному в каждом направлении. Если у сущности Recipe есть отношение ко многим ingredients, обратным будет отношение Ingredient сущности ко многим recipes.

  2. Используйте промежуточную сущность, подобную 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 привлекательным по сравнению с непосредственным использованием базы данных.

...