2014-09-10 2 views
1

Я хотел бы, чтобы пользователь мог просматривать табличный вид шекспировских монологов, чтобы найти тот, который им больше всего нужен.filterContentForSearchText для нескольких свойств объекта одновременно

Например, есть персонаж по имени Хелена в «All's Well That Ends Well», но есть еще один персонаж по имени Хелена в «Сон в летнюю ночь». Я хотел бы, чтобы пользователь мог ввести имя символа и имя воспроизведения в той же строке поиска, чтобы показать их желаемые результаты.

Например: поисковый запрос «helena midsummer» должен только включите монологи, на которых говорит Хелена в «Сон в летнюю ночь».

В настоящее время при поиске «helena»: результаты показывают монологи из «All's Well That End Well» и «Сон в летнюю ночь».

Но при поиске «helena midsummer» или даже просто «helena»: результатов не найдено.

Как разрешить filterContentForSearchText игнорировать все пробелы и в то же время смотреть, соответствует ли какой-либо аспект поискового запроса какой-либо части монолога, будь то имя автора, текст, название, символ и т. Д. .?

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
NSArray* words = [searchText componentsSeparatedByCharactersInSet :[NSCharacterSet whitespaceCharacterSet]]; 
searchText = [words componentsJoinedByString:@""]; 

NSPredicate *p0 = [NSPredicate predicateWithFormat:@"title contains[cd] %@", searchText]; 
NSPredicate *p1 = [NSPredicate predicateWithFormat:@"authorFirst contains[cd] %@", searchText]; 
NSPredicate *p2 = [NSPredicate predicateWithFormat:@"authorLast contains[cd] %@", searchText]; 
NSPredicate *p3 = [NSPredicate predicateWithFormat:@"text contains[cd] %@", searchText]; 
NSPredicate *p4 = [NSPredicate predicateWithFormat:@"gender contains[cd] %@", searchText]; 
NSPredicate *p5 = [NSPredicate predicateWithFormat:@"tone contains[cd] %@", searchText]; 
NSPredicate *p6 = [NSPredicate predicateWithFormat:@"period contains[cd] %@", searchText]; 
NSPredicate *p7 = [NSPredicate predicateWithFormat:@"age contains[cd] %@", searchText]; 
NSPredicate *p8 = [NSPredicate predicateWithFormat:@"length contains[cd] %@", searchText]; 
NSPredicate *p9 = [NSPredicate predicateWithFormat:@"notes contains[cd] %@", searchText]; 
NSPredicate *p10 = [NSPredicate predicateWithFormat:@"tags contains[cd] %@", searchText]; 
NSPredicate *p11 = [NSPredicate predicateWithFormat:@"character contains[cd] %@", searchText]; 

NSPredicate *predicateAll = [NSCompoundPredicate orPredicateWithSubpredicates:@[p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11]]; 
searchResults = [monologuesArray filteredArrayUsingPredicate:predicateAll]; 
} 

ответ

0

Я смог найти решение здесь.

Core Data Query Multiple Columns with Single Search String

Мой новый filterContentForSearchText выглядит следующим образом:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope { 
NSString *sep = @", "; 
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:sep]; 
searchText = [searchText stringByReplacingOccurrencesOfString:@", " withString:@" "]; 
NSMutableArray *array = [searchText componentsSeparatedByCharactersInSet:set]; 

// The array splits up searchText based on dividing characters. 
// However, this split creates a new element immediately that just a "" string. This empties the search results. 
// This if statement ignores empty elements in the array, only recognizing a new element when a non-space character is entered. It's great! 
if ([array.lastObject isEqualToString:@""] || [array.lastObject isEqualToString:@" "]) { 
    // This keeps array from destroying itself and crashing. 
    if (array.count > 1) { 
     NSLog(@"last object was %@",array.lastObject); 
     [array removeLastObject]; 
    } 
} 

NSMutableArray *subPredicates = [NSMutableArray array]; 
for (NSString *q in array) { 
    [subPredicates addObject: 
    [NSPredicate predicateWithFormat:@"title contains[cd] %@ OR character contains[cd] %@ OR authorFirst contains[cd] %@ OR authorLast contains[cd] %@ OR text contains[cd] %@ OR gender contains[cd] %@ OR tone contains[cd] %@ OR period contains[cd] %@ OR age contains[cd] %@ OR length contains[cd] %@ OR notes contains[cd] %@ OR tags contains[cd] %@", q, q, q, q, q, q, q, q, q, q, q, q]]; 
} 

NSCompoundPredicate *predicate = [[NSCompoundPredicate alloc] initWithType:NSAndPredicateType 
                   subpredicates:subPredicates]; 

searchResults = [monologuesArray filteredArrayUsingPredicate:predicate]; 
} 
Смежные вопросы