2015-03-24 4 views
10

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

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

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

+2

Что это такое, что вы не понимаете, и что вы надеетесь учиться на примере? –

ответ

15

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

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

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

many-to-many

Если вы все еще хотите увидеть примеры того, как это сделать, найдите что-то вроде «Основные данные для многих отношений», и вы найдете много. Вы можете начать здесь, на StackOverflow; быстрый поиск показал ряд примеров, в том числе How do you manage and use "Many to many" core data relationships?.

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

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 работает одинаково на обоих языках.

+0

Спасибо. Я понимаю, что Core Data не работает как реляционная база данных. Если вы посмотрите на раздел «Многие-ко-многим» в документе «Основные данные», он говорит о промежуточном (совместном) объекте, где он подходит, если требуется дополнительный атрибут - в моем случае - атрибут меры в объекте RecipeIngredient. Я хотел бы узнать, как процесс отбора выполняется для этого совместного предприятия. –

+0

Это имеет смысл, но не было видно из вашего вопроса. Однако я не вижу, как выборка является проблемой. Маловероятно, что вы хотите получить промежуточную сущность самостоятельно, не так ли? Поэтому просто используйте соответствующее свойство управляемого объекта (например, рецепт), который вам уже нужно получить для промежуточного объекта. Я обновлю ответ ... – Caleb

+1

Большое спасибо за то, что нашли время и поделились своими знаниями. Теперь это намного яснее. –

Смежные вопросы