Как я могу использовать NSPredicate для фильтрации основных связей данных? - PullRequest
5 голосов
/ 09 сентября 2010

Скажем, у меня есть основные объекты данных типа "obj", у которых есть свойство "propertyA" и отношение один ко многим с объектом типа "sub", который имеет два свойства, "propertyB" и "propertyC".

Я хочу получить все объекты, у которых propertyA равно значению, и sub obj с установленными propertyB и propertyC.

Если бы это было просто propertyA и propertyB, я бы сделал

[NSPredicate predicateWithFormat:@"ANY sub.propertyB = %@ AND propertyA == %@", ...];

Проблема в том, что я не могу понять, как добавить второе свойство. Мне нужны только объекты, у которых есть хотя бы один саб, имеющий два свойства true. Я пробовал следующее, но это не работает:

[NSPredicate predicateWithFormat:@"ANY (sub.propertyB = %@ AND sub.propertyC) AND propertyA == %@", ...];

Я пробовал это без ЛЮБОГО, но это тоже не работает. Как я могу это сделать?

Ответы [ 2 ]

7 голосов
/ 11 сентября 2010

Поскольку у вас есть отношение ко-многим с подобъектом, свойство subs obj возвращает набор вместо одного объекта. Чтобы запросить набор, вам нужно использовать SUBQUERY.

Подзапросы имеют вид:

SUBQUERY(collection, $individualCollectionItem, expression-with-collection-item)

в этом случае вы бы хотели что-то вроде

SUBQUERY(subs,$s,$s.propertyB==%@) AND SUBQUERY(subs,$s,$s.propertyC!=NULL)
4 голосов
/ 13 сентября 2010

Решение выглядит следующим образом:

[NSPredicate predicateWithFormat:@"propertyA == %@ AND (SUBQUERY(sub, $s, $s.propertyB == %@ AND $s.propertyC == %@).@count != 0)",  propertyAvalue, propertyBvalue, propertyCvalue];

, где значения в конце - это значения, которым вы хотите, чтобы различные свойства были равны.

...