[英]text search too slow on sqlite db on tableview on iphone
我有一個大約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查詢中,因此它會不斷追加搜索字符。 當用戶輸入鍵盤鍵時,鍵盤變得非常粘,輸入速度很慢。 任何建議將不勝感激......
SQLite的選擇通常非常快。 如果您發布了一些示例查詢,則可能更容易為您提供幫助。
但是,如果您有一個查詢,其中一個簡單的WHERE子句執行緩慢,您可能沒有對正在搜索的列的索引。 加一個。
表中的2500個條目對於SQLite來說並不大。 25,000,000會很大。
當您使用SQLite時,您可以使用sqlite3 shell在桌面上測試很多東西。 例如,如果您的查詢類似於:
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的經驗法則很簡單:如果你要搜索它,它應該被編入索引。
在第一個字符之后,將結果數據復制到一個數組中,然后使用謂詞過濾數組。 它快得多。 然后從數組中重新加載表。 該數組可能是一個字典數組,其中每個元素都是帶有搜索字符串的字典(即名稱或其他),另一個條目是您希望作為最終選擇的核心數據實體的引用。 或者,您可以在用戶進行選擇時最終選擇核心數據。
請注意,使用謂詞進行過濾時,數組中的對象需要具有與您要搜索的屬性匹配的屬性。 在我的例子中,我創建了一個具有屬性fullName emailAddressString等的對象。
predicate = [NSPredicate predicateWithFormat:@“fullName包含[cd]%@或emailAddressString包含[cd]%@”,searchString,searchString];
NSArray * resultArray = [[NSArray alloc] initWithArray:[allContacts filteredArrayUsingPredicate:predicate]];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.