Настройка 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"];
Как бы я каскадировал второе условие в предикат и вернул правильные результаты?
Ответы
Ответ 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).