我试图在之前的帖子中构建一个谓词,但最终这样做是因为3小时后,我无法让它工作。
我觉得必须有一种更有效的方法,我也需要谓词不区分大小写。
10,000辆汽车 我有一个轮胎,轮子,座椅作为三个汽车零件 我想找到所有有轮胎的车。 然后我想找到所有有车轮的车。 然后我想找到所有有座位的汽车。 (我知道很多都是重复的,但这就是我需要的)如果有更有效的方法,请告诉我。 另请告诉我如何使谓词不区分大小写。
提前谢谢!
-(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;
}
答案 0 :(得分:11)
听起来你真正想要的是如何基于一系列可能的匹配来构造谓词。在这种情况下,你会做这样的事情:
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"
一样,每个数组条目有一个组件。只需一次取得即可一次性评估它们。
如果您在获取中使用它,不会获得重复的结果。您对表明您不想要重复的问题留下了评论。如果是这种情况,那么我不确定我知道很多会重复,但这就是我需要的意味着什么。听起来你想要愚蠢,但你说你没有。
答案 1 :(得分:3)
如果您需要重复项,我认为您必须像目前一样进行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。