NSPredicate: Combine CONTAINS with IN

后端 未结 4 828
庸人自扰
庸人自扰 2020-11-29 09:42

I have a set of users in CoreData and an search field in my application. User has the properties firstname and name.

Currently I have a predicate like \"user.name CO

4条回答
  •  时光取名叫无心
    2020-11-29 10:15

    I don't think that you can combine "IN" with "CONTAINS" in a predicate. But you could split the search string into words, and create a "compound predicate":

    NSString *searchString = @"John  Sm ";
    NSArray *words = [searchString componentsSeparatedByString:@" "];
    NSMutableArray *predicateList = [NSMutableArray array];
    for (NSString *word in words) {
        if ([word length] > 0) {
            NSPredicate *pred = [NSPredicate predicateWithFormat:@"user.name CONTAINS[c] %@ OR user.firstname CONTAINS[c] %@", word, word];
            [predicateList addObject:pred];
        }
    }
    NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicateList];
    NSLog(@"%@", predicate);
    

    This example produces the predicate

    (user.name CONTAINS[c] "John" OR user.firstname CONTAINS[c] "John") AND
    (user.name CONTAINS[c] "Sm" OR user.firstname CONTAINS[c] "Sm")
    

    which would match "John Smith", but not "John Miller".

提交回复
热议问题