2016-10-30 66 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

相關問題