我有一个大约有2500个条目的大表格。我正在将其显示在tableview上。然而,在进行动态搜索时,搜索栏太慢了。也就是说,每当用户在搜索栏中输入一个字符时,我都会对表格进行过滤。
代码如下:
- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText {
if([searchText length] > 0) {
searching = YES;
letUserSelectRow = YES;
self.tableView.scrollEnabled = YES;
[self searchTableView];
} else {
searching = NO;
letUserSelectRow = NO;
self.tableView.scrollEnabled = NO;
[whereClause setString: @"%%"];
}
[self.tableView reloadData];
}
- (void) searchTableView {
NSString *searchText = searchBar.text;
[whereClause setString: @"%%"];
[whereClause appendString: searchText];
[whereClause appendString: @"%%"];
[self.tableView reloadData];
}whereClause在sqlite查询中,所以它一直附加搜索字符。当用户在键盘上键入时,按键变得相当粘滞且键入速度很慢。任何建议都将不胜感激。
发布于 2010-08-06 04:18:08
SQLite的selects通常非常快。如果您发布了一些示例查询,可能会更容易帮助您。
但是,也就是说:如果您有一个执行缓慢的简单WHERE子句的查询,那么您可能没有正在搜索的列上的索引。添加一个。
表中的2500个条目对于SQLite是NOT large。2,500,000,000将是很大的。
在使用SQLite时,可以使用sqlite3外壳在桌面上测试很多东西。例如,如果您的查询类似于:
SELECT * FROM MyTable WHERE Column='A';你可以这样做:
EXPLAIN QUERY PLAN SELECT * FROM MyTable WHERE Column='A';如果您看到如下输出:
0|0|TABLE MyTable这意味着SQLite正在爬行整个表以获取结果。
在这种情况下,添加索引会有所帮助:
CREATE INDEX MyTableColumn ON MyTable(Column);然后,上面的解释将会给你类似这样的东西:
0|0|TABLE MyTable WITH INDEX MyTableColumn如果WHERE子句比较复杂,则可能需要创建一个复合索引,因为SQLite在每个表中只使用一个索引。
CREATE INDEX MyTableFirstSecond ON MyTable(First,Second);所以在你的例子中:
SQLite的经验法则很简单:如果你要搜索它,它应该被索引。
https://stackoverflow.com/questions/3418127
复制相似问题