Я предполагаю, что с вашей заявленной цели («... запрашивать все фильмы, показывающие театр с особым графиком»), что объект для 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];
В качестве широкой рекомендации, я хотел бы сделать некоторые изменения названия ваших атрибуты и сущности; это поможет прояснить ситуацию:
- имена сущностей обычно должно быть в единственном числе, так
Movie
не Movies
, Theatre
не Theatres
и Schedule
не Schedules
.
- Подобным образом имена отношений должны отражать, являются ли они одними или ко многим. Таким образом, объект Movie должен иметь отношение
theatre
, поскольку он является одним, а объект Schedule должен иметь отношения movies
, поскольку он является для многих.
Наконец-то, я думаю, вы можете улучшить свою модель данных. В настоящее время в каждом фильме может быть только один театр. На практике я бы предположил, что фильм будет показан в более чем одном театре! Лично я бы модель так:
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];