#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’, причина: ‘здесь не разрешено использовать несколько ключей для многих’, можете ли вы что-нибудь посоветовать? Спасибо!