Предикат Core Data для любой строки связанного объекта

Далее я опишу упрощение моей схемы Core Data, которое, как я уверен, будет эквивалентно моей реальной ситуации.

введите здесь описание изображения

У меня есть две сущности First и Second, связанные отношением "многие ко многим" r.

Second имеет два логических атрибута, назовем их take и you_should_not_take. Я хочу сделать запрос, который выбирает строку First, если он выходит из связанной строки Second для с take = true.

Я пробовал этот предикат:

NSPredicate(format: "ANY (%K == YES && %K == NO)", "r.take","r.you_should_not_take")

но Core Data выдает следующую ошибку: "[General] Unable to parse the format string".

Может быть, я должен использовать это:

NSPredicate(format: "((ANY %K == YES) && (ANY %K == NO))", "r.take","r.you_should_not_take")

но я боюсь, что этот последний запрос выберет строку First, если и только если существует строка x из Second, для которой x.take == YES && существует строка y, если Second для которой y.you_should_not_take == NO, без гарантии, что x == y.

SQL-запрос было бы очень просто сделать, но я не очень разбираюсь в Core Data, поэтому, пока я попробую еще несколько запросов (и я проверю, делает ли второй запрос то, что я думаю), я также спросил здесь надеясь, что ответ будет таким же простым, как в SQL.


person Nisba    schedule 10.12.2016    source источник
comment
Почему бы не просто NSPredicate(format: "ANY %K == YES", "r.take") ?   -  person Martin R    schedule 10.12.2016
comment
@MartinR Два атрибута в исходной схеме не коррелированы, я мог бы выбрать разные имена для этого вопроса.   -  person Nisba    schedule 10.12.2016
comment
Итак, вы хотите выбрать все объекты First, которые связаны (по крайней мере с одним) объектом Second, для которого take==true и you_should_not_take==false? Это правильно?   -  person Martin R    schedule 10.12.2016
comment
@MartinR, точно   -  person Nisba    schedule 10.12.2016
comment
Сорри не забыл ответить   -  person Nisba    schedule 12.12.2016


Ответы (1)


Чтобы выбрать все объекты First, которые связаны с (по крайней мере, одним) объектом Second, для которого take==true и you_should_not_take==false необходимо использовать ПОДЗАПРОС. Что-то вроде (не проверено):

SUBQUERY(r, $x, $x.take == YES AND $x.you_should_not_take == NO).@count > 0
person Martin R    schedule 10.12.2016
comment
Отлично работает! - person Nisba; 12.12.2016