Есть ли эффективный способ сделать запрос к базе данных Android быстрее? - PullRequest
5 голосов
/ 03 сентября 2010

В моем приложении для Android мне нужно получить 50 000 записей в базе данных (текст) и сравнить их со значением в начале действия (в onCreate()). Я делаю это самым простым способом: я получаю всю таблицу от БД до курсора. Однако этот путь слишком медленный. Есть ли другие способы сделать это более эффективно?

Редактировать: Приложение "решатель скрэббл", поэтому я не использую в своем запросе предложение WHERE (возьмите все данные и сравните их с комбинацией входных букв) Сначала я использовал большую таблицу, которая содержит все возможные слова. Сейчас я использую 26 таблиц. Это уменьшило отставание, и я делаю вызовы из базы данных в потоке - это также решило много проблем. Это все еще немного отстает, но намного лучше.

Ответы [ 4 ]

9 голосов
/ 03 сентября 2010

Подводя итог и добавив немного больше

  1. Пусть база данных выполнит работу по поиску вас, используйте предложение WHERE при выполнении запроса!
  2. Если ваше предложение where не работает со столбцом первичного ключа или уникальным столбцом, вы должны создать индекс для этого столбца. Вот некоторая информация о том, как это сделать: http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#indexes
  3. Google говорит: «Используйте маркеры параметров вопросительного знака, такие как« телефон =? » вместо явных значений в параметре выбора, так что запросы, отличающиеся только этими значениями, будут распознаваться как одинаковые для целей кэширования. "
  4. Запустите анализ запроса, используя EXPLAIN QUERY PLAN http://www.sqlite.org/lang_explain.html и найдите все операции scan, они намного медленнее, чем операции search. Использует индексы, чтобы избежать операций scan.
  5. Не выполняйте никаких трудоемких задач в onCreate(), всегда используйте AsyncTask, Handler, работающие в фоновом потоке или каком-то другом неосновном потоке.
  6. Если вам нужен полнотекстовый поиск, прочитайте: http://www.sqlite.org/fts3.html
2 голосов
/ 03 сентября 2010

Вы никогда не должны читать из базы данных в потоке пользовательского интерфейса.Используйте фоновый поток через AsyncTask или используя обычные потоки.Это устранит проблему с задержкой пользовательского интерфейса.

Ускорение чтения базы данных поможет быстрее донести данные до пользователя, но еще более важно, чтобы выборка данных не мешала пользователю использоватьapp.

Проверьте следующие ссылки:

Потоки безболезненно в Android

YouTube: Написание приложений для Android Zippy

1 голос
/ 03 сентября 2010

По крайней мере, вы можете поместить индекс в поле, которое вы сравниваете, и использовать предложение WHERE.Если вы сравниваете числовые данные, Sqlite (механизм db, используемый Android) поддерживает такие функции, как MIN и MAX.Также, если вы сравниваете частичные строки, вы можете использовать LIKE.Для оптимизации запросов существует множество ресурсов , таких как

1 голос
/ 03 сентября 2010

Используйте предложение WHERE в своем SQL вместо того, чтобы читать все целиком. Затем добавьте индекс по столбцам в предложении WHERE.

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