首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在iphone tableview上sqlite db上的文本搜索速度太慢

在iphone tableview上sqlite db上的文本搜索速度太慢
EN

Stack Overflow用户
提问于 2010-08-06 02:53:28
回答 2查看 1.7K关注 0票数 1

我有一个大约有2500个条目的大表格。我正在将其显示在tableview上。然而,在进行动态搜索时,搜索栏太慢了。也就是说,每当用户在搜索栏中输入一个字符时,我都会对表格进行过滤。

代码如下:

代码语言:javascript
复制
- (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查询中,所以它一直附加搜索字符。当用户在键盘上键入时,按键变得相当粘滞且键入速度很慢。任何建议都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2010-08-06 04:18:08

SQLite的selects通常非常快。如果您发布了一些示例查询,可能会更容易帮助您。

但是,也就是说:如果您有一个执行缓慢的简单WHERE子句的查询,那么您可能没有正在搜索的列上的索引。添加一个。

表中的2500个条目对于SQLite是NOT large。2,500,000,000将是很大的。

在使用SQLite时,可以使用sqlite3外壳在桌面上测试很多东西。例如,如果您的查询类似于:

代码语言:javascript
复制
SELECT * FROM MyTable WHERE Column='A';

你可以这样做:

代码语言:javascript
复制
EXPLAIN QUERY PLAN SELECT * FROM MyTable WHERE Column='A';

如果您看到如下输出:

代码语言:javascript
复制
0|0|TABLE MyTable

这意味着SQLite正在爬行整个表以获取结果。

在这种情况下,添加索引会有所帮助:

代码语言:javascript
复制
CREATE INDEX MyTableColumn ON MyTable(Column);

然后,上面的解释将会给你类似这样的东西:

代码语言:javascript
复制
0|0|TABLE MyTable WITH INDEX MyTableColumn

如果WHERE子句比较复杂,则可能需要创建一个复合索引,因为SQLite在每个表中只使用一个索引。

代码语言:javascript
复制
CREATE INDEX MyTableFirstSecond ON MyTable(First,Second);

所以在你的例子中:

  1. 将您的数据库加载到Mac上。
  2. 使用shell来诊断哪些查询速度较慢。
  3. 研究查询速度较慢的原因:需要为哪些查询建立索引?更不可能的是:查询有什么不方便,使查询优化器无法选择合理的计划?
  4. 添加适当的索引或调整query.
  5. Re-test以确保更改有效。

SQLite的经验法则很简单:如果你要搜索它,它应该被索引。

票数 3
EN

Stack Overflow用户

发布于 2010-08-06 03:35:46

在第一个字符之后,将结果数据复制到数组中,然后使用谓词过滤该数组。这要快得多。然后从数组中重新加载您的表。该数组可能是一个字典数组,其中每个元素都是一个带有搜索字符串(例如,名称或其他内容)的字典,另一个条目是对您希望作为最终选择的核心数据实体的引用。或者,当用户做出选择时,您也可以在最后选择核心数据。

请注意,当您使用谓词进行过滤时,数组中的对象需要具有与您要搜索的内容相匹配的属性。在我的示例中,我创建了一个具有fullName emailAddressString等属性的对象。

predicate = [NSPredicate predicateWithFormat:@"fullName包含scd%@或emailAddressString包含scd%@“,searchString,searchString];

NSArray *resultArray = [NSArray alloc :所有联系人过滤filteredArrayUsingPredicate:谓词];

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3418127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档