启用 UISearchDisplayController 以搜索包含字符串的文本
Enable UISearchDisplayController to search text contains string
这是我的 UISearchDisplayController
如果我执行搜索并且 return 匹配起始字母的结果,它就可以工作。
但是,我要做的是启用文本包含字符串的搜索。
例如,如果我有数据 chocolate chip
和 dark chocolate
,当我在搜索栏上键入 chocolate
时,我希望 return 这两个结果。
下面的代码只有returnchocolate chip
但没有dark chocolate
:
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 ? '%' || '%';"
。但这不起作用。
如有任何建议,我们将不胜感激。
提前致谢。
取决于你在哪里查询结果。
如果查询数组,使用 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);
});
}
这是我的 UISearchDisplayController
如果我执行搜索并且 return 匹配起始字母的结果,它就可以工作。
但是,我要做的是启用文本包含字符串的搜索。
例如,如果我有数据 chocolate chip
和 dark chocolate
,当我在搜索栏上键入 chocolate
时,我希望 return 这两个结果。
下面的代码只有returnchocolate chip
但没有dark chocolate
:
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 ? '%' || '%';"
。但这不起作用。
如有任何建议,我们将不胜感激。 提前致谢。
取决于你在哪里查询结果。
如果查询数组,使用 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);
});
}