最有效的搜索方式使用nsprecate OR语句



我试图在以前的帖子中建立一个谓词,但最终这样做,因为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

最新更新