我已经开始使用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或OR等等.
我这样做的几个属性,相同的代码,但为不同的关系创建谓词等。基本上,这样用户就可以过滤他们看到的数据,例如哪架飞机。
不管怎么说,一旦我为其中的每一个构建了一个谓词,我就像这样组合它们:
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的一部分的任何问题--很多关系,但是执行ANY battery。但它揭示了下一个问题(可能一直都是问题)。
发布于 2014-04-10 20:39:43
把“和”和“或”混合在一个复合谓词中我做了这个..。
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);发布于 2014-03-03 22:53:46
结果,NSCompoundPredicate返回TRUEPREDICATE,因为我的化合物中的第一个子谓词是零。(简单,嗯?)因此,如果第一个子谓词是nil,那么如果其他任何子谓词都不是nil,那么它将停止并返回TRUEPREDICATE,而不过滤您的提取。
https://stackoverflow.com/questions/22135421
复制相似问题