2015-05-12 5 views
3

У меня есть модель ядра данных, как это:CoreData: Запрос на один-ко-многим-ко-многим

enter image description here

и я пытаюсь запросить все фильмы, показывающие театр, особенно график.

Но я не могу понять, как я могу выполнить этот запрос с помощью NSPredicate.

Я попытался это:

NSPredicate *moviesPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY (movies, $x, $x.movies.showTimes == %@ AND $x.movies.theater.nameOfTheater == %@)[email protected] >0", showTime, theater]; 

, но не работает. Кто-нибудь из вас знает, что я делаю неправильно?

Я очень ценю вашу помощь

ответ

1

Я предполагаю, что с вашей заявленной цели («... запрашивать все фильмы, показывающие театр с особым графиком»), что объект для NSFetchRequest является Movies. Если это так, имена атрибутов и отношений, которые вы используете, должны относиться к этому объекту. Следовательно, название театра будет дано theaters.nameOfTheater, а время показа будет showTimes.showTimes. Поскольку существует Schedules для данного Movie, вашему предикату необходимо выбрать фильм, если ЛЮБОЙ из showTimes.showTimes соответствует вашему требованию. Таким образом, один из способов, чтобы написать предикат будет:

NSPredicate *moviesPredicate = [NSPredicate predicateWithFormat:@"theaters.nameOfTheater == %@ AND (ANY showTimes.showTimes == %@)", theater, showTime]; 

В качестве альтернативы, ANY положение может быть переписано как подзапрос:

NSPredicate *moviesPredicate = [NSPredicate predicateWithFormat:@"theaters.nameOfTheater == %@ AND SUBQUERY(showTimes, $x, $x.showTimes == %@)[email protected] > 0", theater, showTime]; 

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

  1. имена сущностей обычно должно быть в единственном числе, так Movie не Movies, Theatre не Theatres и Schedule не Schedules.
  2. Подобным образом имена отношений должны отражать, являются ли они одними или ко многим. Таким образом, объект Movie должен иметь отношение theatre, поскольку он является одним, а объект Schedule должен иметь отношения movies, поскольку он является для многих.

Наконец-то, я думаю, вы можете улучшить свою модель данных. В настоящее время в каждом фильме может быть только один театр. На практике я бы предположил, что фильм будет показан в более чем одном театре! Лично я бы модель так:

Data Model

Schedule Таким образом, каждый имеет отношение только один Movie и один Theater. Но у каждого Theater есть много showings, и у каждого Movie есть много screenings. Используя эту модель, предикат для удовлетворения вашего запроса будет выглядеть так:

NSPredicate *moviesPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(screenings, $x, $x.theater.nameOfTheater == %@ AND $x.showTime == %@)[email protected] > 0", theater, showTime];