Настройка NSP-предиката с несколькими условиями - PullRequest
29 голосов
/ 15 мая 2011

Я не уверен, как можно «каскадировать» несколько условий в NSPredicate.

Я довольно новичок в Core Data и не уверен, что это правильный способ достичь того, что я ищуделать.

Вот что я пытаюсь сделать:

Существует объект Photo, имеющий отношение whereTook к объекту Location, который имеет обратное значение photosTookThere.

Фотография, в свою очередь, имеет атрибут NSNumber с именем isFavourite.

Я хотел бы настроить запрос NSFetchRequest, который сначала проверит, что photosTookThere существует, и если это так, проверит каждый результирующий объект Photo и вернет только те, которыеустановить как избранное.

Вот код, приведенный на данный момент:

request.entity = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:context];
request.sortDescriptors = [NSArray arrayWithObject[NSSortDescriptorsortDescriptorWithKey:@"locationId" ascending:YES]];
request.predicate = [NSPredicate predicateWithFormat:@"photosTookThere.@count != 0"];

Как бы я каскадировал второе условие в предикате и возвращал правильные результаты?

Ответы [ 3 ]

62 голосов
/ 15 мая 2011

Просто поместите каждое условие в скобки и свяжите их с AND.

[NSPredicate predicateWithFormat:@"(photosTookThere.@count != 0) AND (isFavourite == %@)", [NSNumber numberWithBool:YES]];

Я бы также рекомендовал изменить имя вашего отношения "whereTook" на "location", а ваш "photosTookThere" напросто «фото», это больше соответствует соглашению.

8 голосов
/ 30 мая 2011

Мне удалось решить эту проблему с помощью подзапроса:

request.predicate = [NSPredicate predicateWithFormat:
                         @"(photosTookThere.@count !=0) AND SUBQUERY(photosTookThere, $Photo, $Photo.isFavourite==1).@count >0"
                         ];
6 голосов
/ 15 мая 2011

Вы можете очень просто использовать AND и OR в своем предикате так же, как если бы вы указывали условие «где» в операторе SQL. Чтобы проверить NULL, который выглядит так, как вы хотите при сравнении с «whereTook», вы можете сравнить с nil (whereTook = nil).

...