使用NSPredicate OR语句进行搜索的最有效方法

时间:2013-01-02 17:53:36

标签: ios core-data nspredicate

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

2 个答案:

答案 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