Когда я должен выполнять некоторые операции SQLite в другом потоке (а не в основном потоке)?
В моем приложении Android есть база данных SQLite с классом SQLiteOpenHelper
, которая поможет вам в этом. Во время использования приложения пользователь может выполнять некоторые операции, такие как добавление/удаление/обновление и т.д. В базе данных.
В некоторых случаях размер операции будет известен, например:
- пользователь нажимает кнопку для сохранения элемента
-
SQLiteDatabase
выполняет один insert
запрос
- пользователь продолжает использовать приложение
В других областях приложения операция может быть большой, например, вставлять сразу 10 элементов в базу данных.
Вопросы:
- Должен ли я выполнять простые операции, такие как вставка/обновление/удаление/просмотр 1 элемента?
- потребуется больше времени, чтобы вставить 1 элемент в таблицу, которая содержит много элементов (например, 30+), чем требуется для вставки в таблицу без элементов?
- если мне не нужно вставлять такие простые операции, в какой момент вы предлагаете я начать потоки их?
когда я говорю thread, я имею в виду использование потока, который не является основным потоком пользовательского интерфейса.
edit: Я понимаю, что небольшие операции не занимают много времени, и я вполне мог уйти с ними в основном потоке. Я просто обеспокоен тем, что было бы плохой практикой выполнять их в основном потоке и хотелось бы уточнить!
Ответы
Ответ 1
Общее правило для всего: если оно достаточно быстро, сделайте это в основном потоке. Если нет, используйте рабочий поток.
Если у вас есть невероятно большая база данных, одна операция почти никогда не гарантирует отдельный поток. Базы данных в целом хорошо масштабируются, но, конечно, очень большая база данных (10 000+ строк?) Будет немного медленнее, чем небольшая. 30 строк, однако, ничего.
Я бы начал загружать файлы, если у вас много операций, таких как куча запросов или сложные запросы, которые охватывают несколько таблиц.
Как и все - профайл приложения, и если он слишком медленный, оптимизируйте. Не пишите удивительный синхронизированный супер-пупер с многоядерной обработкой базы данных, если ни один из ваших запросов не занимает больше 2 мс.
Ответ 2
Всегда измерьте перед оптимизацией!
Убедитесь, что операции с БД, которые вы делаете, влияют на работу пользователя, а затем начинают искать решение.
Если материал базы данных замедляется, используйте AsyncTask, который был предназначен для выполнения задач в фоновом режиме, а затем обновить графический интерфейс ПО ВОСТОЧНОМУ ВРЕМЕНИ.
Ответ 3
Абсолютно нет причин использовать здесь нить. Просто верните курсор, извлеките информацию из курсора и верните ее в основное действие.
В частности, нить - это что-то идеально, что будет повторяться до тех пор, пока что-то не произойдет или не истечет время. Поскольку база данных, которую вы используете, я предполагаю, находится по телефону, для ее доступа потребуется практически нулевое время.
Еще одна вещь, которую вы можете сделать, - создать класс Utility, чтобы помочь вашей активности взаимодействовать с базой данных. Это будет то, что ваша деятельность требует взаимодействия с базой данных. В частности, поток управления будет таким:
Активность → Утилита → База данных
Взаимосвязь между активностью и базой данных, чтобы изолировать их друг от друга и облегчить доступ к тем, что им нужно, так как не нужно напрямую обращаться к самой базе данных.