Когда мне следует выполнять определенные операции SQLite в другом потоке (не в основном потоке)? - PullRequest
40 голосов
/ 19 февраля 2011

Мое приложение Android включает в себя базу данных SQLite с классом SQLiteOpenHelper, который помогает ей управлять. Во время использования приложения пользователь может выполнять некоторые операции, такие как добавление / удаление / обновление и т. Д. В базе данных.

В некоторых точках будет известен размер операции, например:

  1. пользователь нажимает кнопку, чтобы сохранить элемент
  2. SQLiteDatabase выполняет один insert запрос
  3. пользователь продолжает использовать приложение

В других областях приложения операция может быть большой, например, вставка 10+ элементов в базу данных одновременно.

Вопросы:

  • Должен ли я выполнять простые операции, такие как вставка / обновление / удаление / просмотр 1 элемента?
  • потребуется больше времени для вставки 1 элемента в таблицу, содержащую много элементов (например, 30+), чем для вставки в таблицу без элементов?
  • если мне не нужны потоки для таких простых операций, в какой момент вы предлагаете мне начать их обработку?

когда я говорю thread я имею в виду использование потока, который не является основным потоком пользовательского интерфейса.

edit: Я понимаю, что небольшие операции не занимают много времени, и я вполне могу сойти с рук, выполняя их в главном потоке. Я просто обеспокоен тем, что было бы плохо выполнять их в главном потоке, и хотел бы получить разъяснения!

Ответы [ 3 ]

41 голосов
/ 19 февраля 2011

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

Если у вас нет смехотворно огромной базы данных, одна операция почти никогда не требует отдельного потока.Базы данных в целом рассчитаны на хорошее масштабирование, но, конечно, очень большая база данных (более 10 000 строк?) Будет немного медленнее, чем маленькая.Однако 30 строк - это ничто.

Я бы начал многопоточность, если у вас много операций, например, набор запросов или сложные запросы, охватывающие несколько таблиц.со всем - профилируйте свое приложение, и, если оно слишком медленное, оптимизируйте.Не пишите потрясающий синхронизированный обработчик базы данных с поддержкой суперядерного многоядерного процессора, если ни один из ваших запросов не занимает больше 2 мс.

6 голосов
/ 19 февраля 2011

Всегда измеряйте, прежде чем оптимизировать!

Убедитесь, что операции с БД влияют на пользовательский опыт, а затем начинайте искать решение.

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

2 голосов
/ 19 февраля 2011

Абсолютно нет причин использовать нить здесь.Просто верните курсор, извлеките информацию из курсора и верните ее к основному действию.

В частности, поток - это нечто идеально, которое будет повторяться до тех пор, пока что-то не произойдет или не истечет время ожидания.Так как база данных, которую вы используете, я полагаю, находится на телефоне, для ее доступа к ней потребуется практически нулевое время.

Также еще одна вещь, которую вы можете сделать, - это создать класс Utility, который поможет вам взаимодействовать с базой данных.,Это было бы то, что ваша деятельность призывает взаимодействовать с базой данных.В частности, поток управления будет выглядеть следующим образом:

Активность -> Утилита -> База данных

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

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