最有效的使用NSPredicate OR语句进行search的方法
我试图在之前的文章中构build一个谓词,但是最终这样做是因为3个小时之后,我无法完成这个工作。
我觉得必须有一个更有效的方法,我也需要谓词不区分大小写。
10,000辆我有一个轮胎,车轮,座位作为三个汽车部件,我想find所有有轮胎的汽车。 那么我想find所有有车轮的汽车。 那么我想find所有有座位的汽车。 (我知道许多将是重复的,但这就是我所需要的)
请让我知道是否有更有效的方法。 也请让我知道如何使谓词不区分大小写。
先谢谢你!
-(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; }
这听起来像你真正想要的是如何构build基于一个可能的匹配数组谓词。 在这种情况下,你可以这样做:
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"
,每个数组条目有一个组件。 做一个一个镜头来评价他们。
如果您在抓取中使用它,这将不会得到重复的结果。 您对表示不想重复的问题发表评论。 如果是这样的话,那么我不知道我所知道的许多将是重复的,但这就是我需要的手段。 这听起来像你想要的模糊,但你说你没有。
如果你需要重复的,我想你必须做3个单独的查询,如你目前正在做的。
如果重复项不重要,则应尝试在所需的三个谓词之间使用OR
来创build复合谓词。 以下将找出所有具有特定车轮,轮胎或座位的车辆:
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"wheelPartName == %@ OR tirePartName == %@ OR seatPartName == %@", wheelPart, tirePart, seatPart];
要使search不区分大小写,请使用==[c]
而不是==
,以便代码中的谓词如下所示:
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"partName ==[c] %@",[inputCarParts objectAtIndex:i]];
看看这个参考: string谓词编程 。