Как мне создать правильный NSPredicate для такого запроса? - PullRequest
1 голос
/ 20 августа 2010

Привет, проблема выглядит так:

У меня есть в CoreData сущности, которые имеют заголовок и связь с ключевыми словами сущностей.

Мне нужен предикат, который поможет мне выбрать все те сущности, название которых содержит ключевые слова, которые я печатаю. У меня есть код ниже, который должен сделать это, но это не так:

NSArray *keywords = [searchString componentsSeparatedByString:@" "];
NSString *predicateString = @"";
for(NSInteger i = 0; i < [keywords count]; i++) {
    if(((NSString*)[keywords objectAtIndex:i]).length != 0) {
        if(i==0) {
            predicateString = [keywords objectAtIndex:i];
        }
        else {
            predicateString = [predicateString stringByAppendingFormat:@" and keywords.normalizedKeyword contains[cd] %@", [keywords objectAtIndex:i]]; 
        }

    }
}

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"keywords.normalizedKeyword contains[cd] %@",predicateString];

Например, у меня есть объекты с такими названиями:

1) "Великая тема раскраски" 2) «Тема для детей» 3) "Автомобили для детей"

БД моих ключевых слов будет содержать:

большой раскраска тема за Дети автомобили

Как я могу создать предикат, когда я набираю, например:

Тема для

результат будет 2) и 3)

или если я наберу:

отличная тема

результат будет 1) и 2)

Любая помощь в получении правильного предиката для достижения этой цели очень ценится. То, что я пытался сделать там, не работает, и у меня нет идей.

Спасибо!

1 Ответ

3 голосов
/ 20 августа 2010

Я нашел ответ сам. Чтобы решить такую ​​проблему, вы должны использовать NSCompoundPredicate. Решение моей проблемы было таким:

    NSArray *keywords = [lowerBound componentsSeparatedByString:@" "];
NSMutableArray *predicates = nil;
for(NSInteger i = 0; i < [keywords count]; i++) {
    if(((NSString*)[keywords objectAtIndex:i]).length != 0) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"keywords.normalizedKeyword contains[cd] %@", [keywords objectAtIndex:i]];
        if(predicates == nil) {
            predicates = [[NSMutableArray alloc] initWithCapacity:0];
        }

        [predicates addObject:predicate];
    }
}

NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];
...