iOS Swift - Core Data примеры со сложной связью данных [закрыто]

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

с моим приложением у меня в настоящее время есть сущность рецепта, ингредиента и RecipeIngredient, которые связывают ингредиенты с рецептом.

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

2 ответов


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

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

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

many-to-many

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

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

updated model

кажется маловероятным, что вы захотите взять один из них RecipeIngredient объекты напрямую; вы, вероятно, просто будете следовать соответствующим отношениям. Таким образом, вы можете создать запрос на выборку, чтобы найти все рецепты, название которых соответствует @"шоколадный торт". (Там множество примеров запросов с использованием предиката в Docs и по всей сети, поэтому я не буду делать это здесь.) Ваш запрос fetch вернет массив рецептов, которые мы могли бы назвать 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, и языковая специфика здесь не играет роли-основные данные работают одинаково на обоих языках.