NSCompoundPredicate混合AND和OR

时间:2014-03-02 23:57:38

标签: ios nspredicate nsfetchedresultscontroller nscompoundpredicate

我已经开始使用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;
}

AircraftNSManagedObject的子类。这个谓词效果很好,我只是循环遍历一些Aircraft个对象,并将每个对象添加到谓词中,所以如果是飞机1或者飞机2等等...

我为几个属性执行此操作,与上面的代码相同,但为不同的关系创建谓词等。基本上,用户可以过滤他们看到的数据,例如哪些飞机。

无论如何,一旦我为每一个构建了一个谓词,我就像这样组合它们:

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的谓词,是一个谓词布尔值。上帝知道为什么它会回归那个?!据推测,返回true是为什么没有视觉变化是获取结果?当返回时没有变化,所有对象都被取出。

编辑2:

现在取得了真正的进展。我修复了battery个对象是NSSet to-many关系的一部分但做ANY battery的问题。但它揭示了下一个问题(可能一直是问题)。

2 个答案:

答案 0 :(得分:3)

事实证明,NSCompoundPredicate正在返回TRUEPREDICATE因为我的化合物中的第一个子谓词是零。 (简单呃?Doh!)因此,如果第一个子谓词为零,那么如果其他任何一个不是nil并不重要,它将停在那里并返回TRUEPREDICATE而不过滤你的提取。

答案 1 :(得分:2)

好的混合" AND#34;和#34;或#34;在复合谓词中,我做到了这一点......

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);