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 и не фильтровать вашу выборку.

Другие вопросы по тегам