我已经开始使用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
对象,并将每个对象添加到谓词中,所以如果飞机 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 就是为什么 fetch 结果没有视觉变化?当返回时没有变化,所有对象都被获取。
编辑2:
现在真正的进步。我已经解决了battery
对象作为 NSSet 对多关系的一部分但执行ANY battery
. 但它揭示了下一个问题(可能是一直以来的问题)。