我试图在以前的帖子中建立一个谓词,但最终这样做,因为3小时后,我无法让它工作。
我觉得必须有一个更有效的方法,我也需要谓词是不区分大小写的。
10000辆汽车我有轮胎、车轮、座椅作为汽车的三个部件我要找到所有有轮胎的车。然后我要找出所有有轮子的车。然后我要找出所有有座位的车。(我知道很多是重复的,但这就是我需要的)
请告诉我是否有更有效的方法。还请让我知道如何使谓词不区分大小写。
提前感谢!
-(NSArray*) loadCarsFromCoreData:(NSMutableArray*)inputCarParts{
NSMutableArray *totalResults=[[NSMutableArray alloc]init];
NSFetchRequest *fetchRequest =[[NSFetchRequest alloc]init];
//To find the cars we are using the car parts
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CarParts" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
NSError *error;
NSMutableArray *predicates =[self parseCarPartsIntoAPredicateArray:inputCarParts];
for (int i=0; i<[predicates count]; i++) {
[fetchRequest setPredicate:[predicates objectAtIndex:i]];
NSArray *records = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
NSLog(@"results = %i",[records count]);
[totalResults addObjectsFromArray:records];
}
NSLog(@"results = %i",[totalResults count]);
return [NSArray arrayWithArray:totalResults];
}
-(NSMutableArray*)parseCarPartsIntoAPredicateArray:(NSMutableArray*)inputCarParts{
NSMutableArray *returnArray=[[NSMutableArray alloc]init];
for (int i=0; i<[inputCarParts count]; i++) {
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"partName == %@",[inputCarParts objectAtIndex:i]];
[returnArray addObject:predicate];
}
return returnArray;
}
听起来您真正要寻找的是如何基于可能匹配的数组构造谓词。在这种情况下,你可以这样做:
NSMutableArray *partPredicates = [NSMutableArray arrayWithCapacity:[inputCarParts count]];
for (NSString *partName in inputCarParts) {
NSPredicate *currentPartPredicate = [NSPredicate predicateWithFormat:@"partName =[c] %@", partName];
[partPredicates addObject:currentPartPredicate];
}
NSPredicate *fullPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:partPredicates];
结果谓词将是类似于partName ==[c] "tire" OR partName ==[c] "wheel" OR partName ==[c] "seat"
的东西,每个数组条目有一个组件。做一次取回,一次评估所有的。
这将而不是得到重复的结果,如果你在fetch中使用它。你在这个问题上留下了评论,表明你不想要重复的。如果是这样的话,那么我不确定是什么,我知道很多是重复的,但这就是我需要的的意思。听起来你想要那些傻瓜,但你说你不想。
如果你需要副本,我认为你必须做3个单独的查询,就像你现在做的。
如果重复不重要,您应该尝试通过在您需要的三个谓词之间使用OR
来创建一个复合谓词。下面的命令将查找具有指定车轮、轮胎或座椅的所有汽车:
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"wheelPartName == %@ OR tirePartName == %@ OR seatPartName == %@", wheelPart, tirePart, seatPart];
要使您的搜索不区分大小写,请使用==[c]
而不是==
,因此代码中的谓词看起来像:
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"partName ==[c] %@",[inputCarParts objectAtIndex:i]];
看一下这个参考:String Predicate Programming