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

Ios 使用NSPredicate或语句进行搜索的最有效方法,ios,core-data,nspredicate,Ios,Core Data,Nspredicate,我在前一篇文章中尝试构建谓词,但最终以这种方式完成,因为3个小时后,我无法让它工作 我觉得必须有一种更有效的方法,而且我需要谓词不区分大小写 10000辆汽车 我有一个轮胎,车轮,座椅作为汽车的三部分 我想找到所有有轮胎的车。 然后我想找到所有有轮子的车。 然后我想找到所有有座位的车。 (我知道很多都是复制品,但这正是我需要的) 如果有更有效的方法,请告诉我。 另外,请让我知道如何使谓词不区分大小写 提前谢谢你 -(NSArray*) loadCarsFromCoreData:(NSMutabl

我在前一篇文章中尝试构建谓词,但最终以这种方式完成,因为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;
}
-(NSArray*)加载来自CoreData的CarsFromCoreData:(NSMutableArray*)inputCarParts{
NSMutableArray*totalResults=[[NSMutableArray alloc]init];
NSFetchRequest*fetchRequest=[[NSFetchRequest alloc]init];
//为了找到汽车,我们正在使用汽车零件
NSEntityDescription*entity=[NSEntityDescription entityForName:@“CarParts”在托管对象上下文:[self-managedObjectContext]]中;
[FetchRequestSetEntity:entity];
n错误*错误;
NSMutableArray*谓词=[self-ParseCarPartsToaPredicateArray:inputCarParts];

对于(inti=0;i如果您需要副本,我认为您必须像当前一样执行3个单独的查询

如果重复项不重要,则应尝试在所需的三个谓词之间使用
创建一个复合谓词。以下将查找所有具有指定车轮、轮胎或座椅的车辆:

NSPredicate *predicate=[NSPredicate predicateWithFormat:@"wheelPartName == %@ OR tirePartName == %@ OR seatPartName == %@", wheelPart, tirePart, seatPart];
要使搜索不区分大小写,请使用
==[c]
而不是
==
,这样代码中的谓词将如下所示:

NSPredicate *predicate=[NSPredicate predicateWithFormat:@"partName ==[c] %@",[inputCarParts objectAtIndex:i]];

看看这个参考:。

听起来你真正想要的是如何基于一系列可能的匹配来构造谓词。在这种情况下,你可以这样做:

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”或partName==[c]“wheel”或partName==[c]“seat”
,每个数组条目有一个组件。执行一次提取以一次性对它们进行评估


如果你在获取中使用它,这将得到重复的结果。你在问题上留下了一条评论,表明你不想要重复的结果。如果是这样的话,那么我不确定我所知道的很多结果都是重复的,但这就是我需要的意思。听起来你想要重复的结果,但你说你不想要

“我知道很多都是复制品,但这正是我需要的“。那么,你想让你的结果对同一个对象有多个条目吗?也就是说,如果它同时有一个轮胎和一个轮子,你想让它出现两次?汽车a=轮子,座位。|汽车b=轮子。|汽车c=座位。|汽车d=轮子,座位,轮胎。|汽车e=行李箱。|我需要a,b,c,d。我如何使用数组来做这件事,它以前对我不起作用。”“NSPredicate*谓词=[NSPredicate predicateWithFormat:@”wheelPartName==%@或tirePartName==%@或seatPartName==%@”,wheelPart,tirePart,seatPart];“就这么做吧。结果就是这样。我讨厌在其他10分钟的事情上浪费8个小时……谢谢我通过向后搜索来做有意义吗?”(part->car),还是我应该加载所有汽车,然后为我的匹配预测该数组?当你说“加载所有汽车”时,你将从哪里加载它们?你使用核心数据吗?是的核心数据(查询实体汽车,不使用过滤器).cars具有零件对多和零件对多与cars将核心数据中的所有Car对象加载到一个数组中只会产生不必要的开销。只需使用谓词从核心数据访问所需的Car对象即可。