NSPredicate для отношений от 2 до многих

#ios #core-data #nspredicate

#iOS #основные данные #nspredicate

Вопрос:

У меня проблема с синтаксисом NSPredicate. У меня есть 3 объекта: A, B и C. A имеет отношение «многие ко многим» к B. B имеет отношение «многие ко многим» к C. Я хочу получить все управляемые объекты в A, которые имеют хотя бы одну связь с объектом в B, который, в свою очередь, имеет связь хотя бы с одним объектом в C.

Я пробовал несколько вариантов подзапроса и ЛЮБЫХ ДРУГИХ, но я, очевидно, не использую правильный синтаксис.

Я пробовал:

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *ent = [NSEntityDescription entityForName:@"A" inManagedObjectContext:self.managedObjectContext];
fetchRequest.entity = ent;
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(B, $b, $b.c.@count > 0).@count > 0)"];
  

Это привело к:

2014-06-30 09:07:12.143 Мое приложение [86086:60b] * Завершение работы приложения из-за неперехваченного исключения ‘NSInvalidArgumentException’, причина: ‘Ключевой путь, содержащий агрегат KVC, где его не должно быть; не удалось обработать $b.jobs .@count’

Затем:

 fetchRequest.predicate = [NSPredicate predicateWithFormat:@"ANY b.c.@count > 0"];
  

в результате:

2014-06-30 09:10:14.403 Мое приложение [86186:60b] * Завершение работы приложения из-за неперехваченного исключения ‘NSInvalidArgumentException’, причина: ‘Количество выражений неподдерживаемой функции: (b.c)’

Также:

 fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(B, $b, $b.c.@count > 0))"];
  

в результате:

2014-06-30 09:17:25.883 Мое приложение [86218:60b] * Завершение работы приложения из-за неперехваченного исключения ‘NSInvalidArgumentException’, причина: «Невозможно проанализировать строку формата » (ПОДЗАПРОС (B, $ b, $b.c.@count > 0))»‘

Наконец:

 fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(B, $b, $b.c).@count > 0)"];
  

завершилось:

2014-06-30 09:18:30.202 Мое приложение [86272:60b] * Завершение работы приложения из-за неперехваченного исключения ‘NSInvalidArgumentException’, причина: «Невозможно проанализировать строку формата «(ПОДЗАПРОС (B, $ b, $ b.c).@count > 0)»‘

У кого-нибудь есть идеи? Должен быть простой способ выполнить эту выборку…

Ответ №1:

Это должно сработать:

 [NSPredicate predicateWithFormat:@"SUBQUERY(bs, $b, ANY $b.cs != NULL).@count > 0"]
  

где «bs» — это отношение «ко многим» от объекта A до B, а «cs» — это отношение «ко многим» от B до C.

Комментарии:

1. Спасибо, это сработало! Как вы придумали этот запрос? Я все еще пытаюсь понять SQL-запрос в своей голове, а затем перевести его в NSPredicate. Я должен упомянуть, что я не администратор базы данных или гуру…

2. @nemesys: я это понял некоторое время назад с помощью проб и ошибок 🙂 Как правило, я бы не пытался думать в терминах SQL, а в терминах отношений (Core Data).

3. @MartinR Привет, Мартин, отличный ответ, может быть, вы можете мне помочь, пожалуйста. Мой объект отношений <->> адресует <->> телефоны, которые мне нужны, чтобы проверить, есть ли телефоны. tel содержит мой номер телефона, я пытаюсь [NSPredicate predicateWithFormat:@»ЛЮБОЙ addresses.phones.tel = %@», номер телефона] но я получаю сообщение об ошибке ** Завершение работы приложения из-за неперехваченного исключения ‘NSInvalidArgumentException’, причина: ‘здесь не разрешено использовать несколько ключей для многих’, можете ли вы что-нибудь посоветовать? Спасибо!