2016-10-30 44 views
0

这是我的UISearchDisplayController,如果我执行搜索并返回匹配的起始字母表的结果。
但是,我要做的是启用搜索包含字符串的文本。
例如,如果我有数据chocolate chipdark 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

相关问题