3

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

2 回答 2

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",每个数组条目有一个组件。一次取货即可一次性评估它们。

如果您在 fetch 中使用它,这将不会得到重复的结果。您对该问题发表了评论,表明您不希望重复。如果是这样的话,那么我不确定我知道很多会重复,但这就是我需要的意思。听起来你想要骗子,但你说你不想要。

于 2013-01-02T18:49:15.280 回答
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]];

看看这个参考:字符串谓词编程

于 2013-01-02T18:09:26.860 回答