2016-10-30 6 views
0

Это мой UISearchDisplayController, который работает, если я выполняю поиск и возвращаю результат с соответствующим начальным алфавитом.
Однако, что мне делать, это включить поиск текста, содержащего строку.
Например, если у меня есть данные chocolate chip и dark chocolate, когда я набираю chocolate в строке поиска, я хочу вернуть оба результата.

Следующий код возврата только chocolate chip но не dark chocolate:Включить UISearchDisplayController для поиска текста содержит строку

self.searchDisplayController = [[[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self] autorelease]; 
self.searchDisplayController.searchResultsDelegate = self; 
self.searchDisplayController.searchResultsDataSource = self; 
self.searchDisplayController.searchResultsTitle = NSLocalizedString(@"Matches", @""); 

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    NSString *text = [searchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    if ([text length]) { 
     [self.db fetchCompletionListWithString:text callback:^(NSArray *list) { 
      self.prefixArray = list; 
      [self.searchDisplayController.searchResultsTableView reloadData]; 
     }]; 
    } 
} 

Это fetchCompletionListWithString

- (void)_fetchCompletionListWithString:(NSString *)inStr callback:(void(^)(NSArray *))inCallback 
{ 
    if (!inStr || ![inStr length]) { 
     return; 
    } 

    const char *SQL = "SELECT id,title FROM entries WHERE title LIKE ? || '%';"; 
    ObjSqliteStatement *statement = [[ObjSqliteStatement alloc] initWithSQL:SQL db:db]; 
    [statement bindText:inStr toColumn:1]; 
    NSMutableArray *list = [NSMutableArray array]; 
    while ([statement step]) { 
     NSInteger entryID = [statement intFromColumn:0]; 
     NSString *title = [statement textFromColumn:1]; 
     if (entryID) { 
      [list addObject:@{kMDIdentifierKey:@(entryID), kMDTitleKey:title}]; 
     } 
    } 
    [statement release]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     inCallback(list); 
    }); 
} 

Я попытался изменить *SQL к "SELECT id,title FROM entries WHERE title LIKE ? '%' || '%';". Но это не работает.

Любое предложение будет оценено по достоинству. Спасибо заранее.

ответ

1

В зависимости от того, где вы запрашиваете результат.

Если вы запрашиваете массив, используйте NSPredicate для фильтрации результата следующим образом.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",searchToken]; 

Если запрос на базу данных, использовать SQL запрос так:

SELECT * FROM mytable 
WHERE name LIKE '%chocolate%' 

Надежда эта помощь.

Основываясь на вашем редактировании, вы можете попробовать этот путь как сложный (потому что ваша библиотека, которую вы используете, настолько старая). Если вы хотите обрабатывать SQL, я рекомендую вам использовать Realm

- (void)_fetchCompletionListWithString:(NSString *)inStr callback:(void(^)(NSArray *))inCallback 
{ 
    if (!inStr || ![inStr length]) { 
     return; 
    } 
inStr = [NSString stringWithFormat:@"%%%@%%",inStr]; 
    const char *SQL = "SELECT id,title FROM entries WHERE title LIKE ? ;"; 
    ObjSqliteStatement *statement = [[ObjSqliteStatement alloc] initWithSQL:SQL db:db]; 
    [statement bindText:inStr toColumn:1]; 
    NSMutableArray *list = [NSMutableArray array]; 
    while ([statement step]) { 
     NSInteger entryID = [statement intFromColumn:0]; 
     NSString *title = [statement textFromColumn:1]; 
     if (entryID) { 
      [list addObject:@{kMDIdentifierKey:@(entryID), kMDTitleKey:title}]; 
     } 
    } 
    [statement release]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     inCallback(list); 
    }); 
} 
+0

Спасибо, но я получаю 'использование необъявленного идентификатора«str'' и 'неожиданного имени интерфейса„NSString“: ожидаемые ошибки expression'. – user2872856

+0

Это работа. Спасибо! – user2872856