Примеры iOS Swift - Core Data со сложными отношениями данных

Я пытаюсь понять, как моделировать сложные отношения данных с Core Data.

В моем приложении у меня есть объект Recipe, Ingredient и RecipeIngredient, который связывает ингредиенты с рецептом.

Я не сталкивался с каким-либо примером извлечения данных из этого совместного объекта. Я был бы признателен, если бы кто-то мог привести пример объекта, такого как мой RecipeIngredient в Swift.

Ответ 1

Причина, по которой вы не видели примеры, похожие на ваш объект RecipeIngredient, заключается в том, что вам не нужны совлокальные объекты, подобные этим в Core Data. Вы обрабатываете базовые данные так, как если бы это была реляционная база данных, где вы обычно использовали таблицу соединений, чтобы создавать эффективные отношения "много-ко-многим" между объектами. Как объяснено в разделе раздел "Многие-многие-многие отношения" Руководство по программированию основных данных, с основными данными, все, что вам нужно сделать, это указать отношение "многие" в обоих направлениях между двумя объектами. Обратите внимание на скобки в документах:

(Если у вас есть фон в управлении базой данных, и это вас беспокоит, не беспокойтесь: если вы используете хранилище SQLite, Core Data автоматически создает для вас промежуточную таблицу соединений.)

Вот иллюстрация отношения, поскольку вы должны ее моделировать, разорвать прямо из редактора модели Xcode:

many-to-many

Если вы все же хотите увидеть примеры того, как это сделать, найдите что-то вроде "Core Data many to many relationship", и вы найдете много. Вы можете начать здесь, на StackOverflow; быстрый поиск показал ряд примеров, в том числе Как вы управляете и используете "Многие для многих" ? основные отношения данных?.

Обновление: Из вашего комментария я понимаю, что вы хотите использовать промежуточный объект для добавления информации о взаимосвязи между рецептами и ингредиентами. Это случай, когда требуется другое лицо. Итак, пусть ваша модель выглядит так:

updated model

Кажется маловероятным, что вы хотите получить один из этих объектов RecipeIngredient напрямую; вы, вероятно, просто выполните соответствующие отношения. Таким образом, вы можете создать запрос на выборку, чтобы найти все Рецепты, чье имя соответствует "шоколадный торт". (Существует множество примеров запросов на выборку с использованием предиката в документах и ​​по всей сети, поэтому я не буду этого делать здесь.) Ваш запрос на выборку возвращает массив рецептов, которые мы могли бы назвать cakeRecipes, но вы Вероятно, он интересуется только одним:

Recipe *cake = cakeRecipes.firstObject;

Теперь, что вы хотите знать о ингредиентах для вашего торта? Вот список ингредиентов:

NSArray *ingredientNames = cake.ingredients.ingredient.name;

Если вы хотите зарегистрировать имена и суммы ингредиентов:

for (RecipeIngredient *i in cake.ingredients) {
    NSLog(@"%@ %@", i.amount, i.ingredient.name);
}

Или вы можете использовать запрос на выборку, чтобы найти ингредиенты, соответствующие "сельдерею", сохраняя результат в celeries. После этого вы можете искать рецепты, включая сельдерей:

Ingredient *celery = celeries.firstObject;
NSArray *recipes = celery.recipes.recipe

Если это не поможет, возможно, вы можете быть более конкретным в этой проблеме. Кроме того, я знаю, что вы попросили Swift, но мои пальцы по-прежнему используются для Obj-C, и языковые особенности на самом деле здесь не играют - Core Data работает одинаково на обоих языках.