iPhone быстрый sqlite запрос - PullRequest
       1

iPhone быстрый sqlite запрос

1 голос
/ 02 ноября 2010

Я набираю около 30 000 слов и показываю в таблице. Слова находятся в файле sqlite. Таким образом, выполнение запроса и загрузка слова в таблицу занимает много времени (15 секунд). Видимо, приложение ждет 15 секунд при запуске.

Как я могу обойти это?

NSLog(@"Query start");


   CFTimeInterval startTime = CFAbsoluteTimeGetCurrent(); 

 FMResultSet *rs = [db executeQuery:@"select * from  words order by no ASC "];
 while ([rs next]) {
     Word *word = [[Word alloc] initWithID:[rs intForColumn:@"id"]
                                        no:[rs stringForColumn:@"no"]
                                        en:[rs stringForColumn:@"en"]];
     [words addObject: word];
 }
 [rs close];  
 [db close]; 

 CFTimeInterval endTime = CFAbsoluteTimeGetCurrent(); 
 float deltaTimeInSeconds = endTime - startTime;
 NSLog(@"Time spent for query: %f seconds", deltaTimeInSeconds);

ПРИМЕЧАНИЕ. Исходная таблица не отсортирована. Это список слов для словаря, поэтому при отображении он должен быть отсортирован по алфавиту в табличном представлении. вот почему мне нужно загрузить все слова. Фоновый поток может быть лучшей идеей, заполнять данные при извлечении из sqlite. Поддерживает ли sqlite это? Выборка данных с помощью метода обратного вызова. например в запросе sqlite для каждой 1000 выбранных записей я обновлю свою таблицу. Я не совсем уверен, как это сделать, если вы знаете, пожалуйста, дайте мне несколько советов.

Ответы [ 3 ]

3 голосов
/ 02 ноября 2010

Используйте LIMIT и OFFSET для выборки порций данных за раз.Кроме того, пусть UITableView управляет процессом выборки.Когда он запускает tableView:cellForRowAtIndexPath: и соответствующая строка недоступна, извлекайте и кэшируйте блок строк, содержащих эту строку, из SQLite.Вы также можете иметь фоновый поток или цикл обработки событий, извлекающий блоки в фоновом режиме, чтобы минимизировать задержку при прокрутке таблицы пользователем.

1 голос
/ 02 ноября 2010

Возможно, вы захотите перейти на Core Data и NSFetchedResultsController вместо непосредственного использования Sqlite.

Одним из больших преимуществ Core Data является то, что он дает вам в плане кэширования и отложенной загрузки объектов.

См. Базовые данные против Sqlite и производительности

1 голос
/ 02 ноября 2010

Я бы предложил две вещи:

Во-первых: вам нужно загрузить все 30000 объектов в память одновременно? Если вам это не нужно, вы можете просто загружать объекты, которые вы собираетесь показывать в таблицу, до тех пор, пока они вам нужны. Вы можете использовать предложение limit в своих запросах, чтобы загрузить только небольшие части данных, которые вам нужны для отображения.

Второе: вы можете попробовать и посмотреть, помогает ли создание индекса по полю no. Хотя вряд ли это значительно улучшит вашу производительность, поскольку большую часть времени iOS будет тратить на создание Word объектов и размещение их в массиве words.

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