Подтвердить что ты не робот

Настройка NSPredicate с несколькими условиями

Я не уверен, как можно было бы "каскадировать" несколько условий в 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:@"[email protected] != 0"];

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

В конце концов я смог решить это с помощью подзапроса:

request.predicate = [NSPredicate predicateWithFormat:
                         @"([email protected] !=0) AND SUBQUERY(photosTookThere, $Photo, $Photo.isFavourite==1)[email protected] >0"
                         ];

Ответ 3

Вы можете просто использовать AND и OR в своем предикате так же, как если бы вы указали условие "where" в инструкции SQL. Чтобы проверить NULL, который, по-видимому, вам нужен при сравнении с "whereTook", вы можете сравнить с nil (whereTook = nil).