2010-08-20 2 views
1

Привет, проблема заключается в следующем:Как создать правильный NSPredicate для такого запроса?

У меня есть объекты 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)

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

Спасибо!

+0

Отливка * НЕ * необходимо. '-objectAtIndex:' возвращает 'id'. 'id' - это все, и все, что делает бросок ненужным и ужасная привычка вступать в Objective-C. –

+0

Ваш цикл 'for' также не нужен. Objective-C имеет быструю переписку, поэтому вы можете переписать ее как 'for (NSString * predicateString в ключевых словах) {' и выполняться с большой логикой. –

ответ

3

Я сам нашел ответ. Чтобы решить эту проблему, вы должны использовать 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];