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

Wil*_*con 3 core-data nspredicate ios

我尝试在之前的帖子中构建一个谓词,但最终这样做是因为在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;
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*ton 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];
Run Code Online (Sandbox Code Playgroud)

结果谓词就像partName ==[c] "tire" OR partName ==[c] "wheel" OR partName ==[c] "seat"是每个数组条目一个组件.进行一次取得以一次性评估它们.

如果您在获取中使用它,则不会获得重复结果.您对表明您不想要重复的问题留下了评论.如果是这种情况,那么我不确定我知道很多会重复,但这就是我需要的意思.听起来你想要愚蠢,但你说你没有.