NSCompoundPredicate Mixing И и ИЛИ
Я начал использовать NSCompoundPredicate
объединить мои предикаты, однако есть проблема.
Вот пример одного предиката:
Aircraft *obj = (Aircraft *)[self.managedObjectContext objectWithID:objID];
if ([predicateAircraft.predicateFormat isEqualToString:@""] || !predicateAircraft)
predicateAircraft = [NSPredicate predicateWithFormat:@"aircraft = %@", obj];
else
{
NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"aircraft = %@", obj];
NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:predicateAircraft, newPredicate, nil]];
predicateAircraft = compoundPredicate;
}
Aircraft
это подкласс NSManagedObject
, Этот предикат работает отлично, я просто перебираю некоторые Aircraft
объекты, и добавление каждого к предикату, так что если aircraft1 ИЛИ aircraft2 ИЛИ и т.д.
Я делаю это для нескольких свойств, того же кода, что и выше, но создаю предикаты для разных отношений и т. Д. В основном, чтобы пользователь мог фильтровать данные, которые он видит, например, какой самолет.
В любом случае, как только я создаю предикат для каждого из них, я объединяю их так:
NSPredicate *predicateFinal = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:predicateAircraft, predicateBatteries, predicatePilot, nil]];
На этот раз, используя AND
объединить их. Однако использование этого предиката вообще не фильтрует мои данные. Они работают индивидуально, но не один раз объединены вместе в этой последней строке. Есть идеи почему? Это то, что мне нужно решить.
У меня есть предчувствие, может быть, это создает это: aircraft1 OR aircraft2 OR ... AND ... pilot1 OR pilot2 OR...
Обычно вам потребуется скобки вокруг каждого бита, например, вокруг самолета и пилотов, чтобы разделить их, но соединение не делает этого?
Эффективно то, что я получаю, это:
aircraft = aircraftObj1 OR aircraft = aircraftObj2 AND pilot = pilotObj1 OR pilot = pilotObj2
Что мне нужно (я думаю):
(aircraft = aircraftObj1 OR aircraft = aircraftObj2) AND (pilot = pilotObj1 OR pilot = pilotObj2)
Независимо от каких-либо идей? Благодарю.
РЕДАКТИРОВАТЬ:
predicateFinal
регистрируется как: TRUEPREDICATE
, Не так много, но, по-видимому, TRUEPREDICATE: предикат, который всегда оценивается как TRUE и является логическим значением предиката. Бог знает, почему это возвращается?! Предположительно, что возвращение истины - это то, почему нет никаких визуальных изменений в результатах поиска? Поскольку, когда это возвращается, нет никаких изменений, все объекты извлекаются.
РЕДАКТИРОВАТЬ 2:
Реальный прогресс сейчас. Я исправил любую проблему с battery
объекты являются частью отношения NSSet ко многим, но делают ANY battery
, Но это выявило следующую проблему (вероятно, проблему все время).
2 ответа
Хорошо, чтобы смешать "И" и "ИЛИ" в составном предикате, я сделал это...
if ([searchCriteria isEqualToString:@"All"]) {
[parr addObject:[NSPredicate predicateWithFormat:@"aID_Name like[cd] %@",mySearchBar.text]];
[parr addObject:[NSPredicate predicateWithFormat:@"aTrackingNum like[cd] [parr addObject:[NSPredicate predicateWithFormat:@"aRegNum like[cd] %@",mySearchBar.text]];
predicate = [NSCompoundPredicate orPredicateWithSubpredicates:parr];
}
[parr removeAllObjects];
[parr addObject:predicate];
if (aGroups)
[parr addObject:[NSPredicate predicateWithFormat:@"SUBQUERY(self.group, $x, $x.gID_Key IN %@).@count > 0",[aGroups valueForKey:@"gID_Key"]]];
predicate = [NSCompoundPredicate andPredicateWithSubpredicates:parr];
NSLog(@"%@",predicate);
Оказывается, NSCompoundPredicate
возвращался TRUEPREDICATE
потому что первый предикат в моем соединении был ноль. (Просто, да?) Так что, если первый предикат имеет значение ноль, не имеет значения, если другие не равны нулю, он остановится и вернется TRUEPREDICATE
и не фильтровать вашу выборку.