слишком медленный поиск текста на sqlite db при просмотре таблиц на iphone - PullRequest
1 голос
/ 05 августа 2010

У меня есть большая таблица около 2500 записей. Я показываю это в виде таблицы. однако панель поиска слишком медленная при выполнении динамического поиска. то есть я фильтрую таблицу каждый раз, когда пользователь вводит символ в строке поиска.

следующий код:

- (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, поэтому он продолжает добавлять символ поиска. Когда пользователь печатает на клавиатуре, клавиши становятся довольно липкими и медленно набирают текст. Любое предложение будет оценено ...

Ответы [ 2 ]

3 голосов
/ 06 августа 2010

SQLite обычно выбирает очень быстро.Если вы отправили несколько примеров запросов, вам, вероятно, будет легче помочь.

Однако, это говорит: если у вас есть запрос с простым предложением WHERE, который выполняется медленно, у вас, вероятно, нет индексана столбце, который ищется.Добавьте одну.

2500 записей в таблицу НЕ большой для SQLite.25 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);

Так что вваш случай:

  1. Загрузите вашу базу данных на Mac.
  2. Используйте оболочку, чтобы определить, какие из ваших запросов медленные.
  3. Изучите запросы, чтобы понять, почему ониМедленно: что нужно проиндексировать?И менее вероятно: что делать с запросом неудобно, мешая оптимизатору запросов выбрать разумный план?
  4. Добавить соответствующие индексы или настроить запрос.
  5. Повторно проверить, чтобы убедиться, что изменениеработает.

Практическое правило с SQLite простое: если вы собираетесь искать по нему, его следует проиндексировать.

1 голос
/ 05 августа 2010

После первого символа скопируйте полученные данные в массив, а затем отфильтруйте массив, используя предикат. Это намного быстрее. Затем перезагрузите таблицу из массива. Массив может быть массивом словарей, где каждый элемент является словарем со строкой поиска (то есть именем или чем-то еще), а другая запись является ссылкой на основной объект данных, который вы хотите использовать в качестве окончательного выбора. Или вы можете просто сделать основной выбор данных в конце, когда пользователь делает выбор.

Обратите внимание, что при фильтрации по предикату объекты в массиве должны иметь свойства, которые соответствуют тому, что вы ищете. В моем примере я создал объект со свойствами fullName emailAddressString и т. Д.

Foregate = [NSPredicate ForexateWithFormat: @ "fullName содержит [cd]% @ или emailAddressString содержит [cd]% @", searchString, searchString];

NSArray * resultArray = [[NSArray alloc] initWithArray: [allContacts FilterArrayUsingPredicate: предикат]];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...