簡體   English   中英

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

[英]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);

所以在你的情況下:

  1. 將您的數據庫存入Mac。
  2. 使用shell來診斷哪些查詢很慢。
  3. 研究查詢以了解它們為什么變慢:需要索引哪些內容? 並且不太可能:查詢怎么樣很尷尬,阻止查詢優化器選擇合理的計划?
  4. 添加適當的索引或調整查詢。
  5. 重新測試以確保更改有效。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM