#android #sqlite #android-room
#Android #sqlite #android-room
Вопрос:
Я хочу интегрировать базу данных Room в мое приложение для Android (JAVA).
Я просмотрел множество материалов, доступных в Интернете для базы данных Room, но ни одно из них не развеяло мои сомнения, которые
- Обязательно ли записывать запросы из основного потока?
- Если да, то что произойдет, если мы напишем запросы в основном потоке?
Ответ №1:
- Обязательно ли записывать запросы из основного потока?
НЕТ
Вы можете разрешить выполнение запросов в основном потоке, инициализировав с помощью .allowMainThreadQueries()
Room.databaseBuilder(this, MyRoomDataBase::class.java, DATABASE_NAME).allowMainThreadQueries()
- Если да, то что произойдет, если мы напишем запросы в основном потоке?
Если вы указали, .allowMainThreadQueries()
то это заблокирует основной поток до тех пор, пока запрос не будет выполнен, в противном случае это приведет к сбою IllegalStateException
, и ваше приложение завершит работу. Лучше не запрашивать в основном потоке
Комментарии:
1. Спасибо @Manohar Reddy
2. Правильный ответ на второй вопрос был бы «Если вы указали
.allowMainThreadQueries()
, то он заблокирует основной поток до тех пор, пока запрос не будет выполнен, в противном случае он выдает ошибкуIllegalStateException
, и ваше приложение вылетает».3. @musooff спасибо отредактировано, вы всегда можете отредактировать, если считаете, что это добавляет какую-то ценность к ответу.
4.Привет, мы используем rooms в сервисе в отдельном процессе от
MainActivity
. Служба будет продолжать работать даже послеMainActivity
закрытия. Я просто хочу узнать мнение других людей, если это хорошая идея разрешить.allowMainThreadQueries()
в базе данных rooms в этом случае? На данный момент мы это разрешили. Все запросы к базе данных выполняются посредством передачи сообщений отFlutter
кMainActivity
серверной частиService
. Мы не блокируемFlutter
сбоку, используяasync
MethodChannel
s.
Ответ №2:
По умолчанию запросы Observable room выполняются из основного потока пользовательского интерфейса. Если вы хотите запускать их через основной поток, вам нужно указать это с помощью приведенного ниже кода.
Room.databaseBuilder(this, MyRoomDataBase::class.java, DATABASE_NAME).allowMainThreadQueries()
ЕСЛИ вы переносите свой возвращаемый тип в LiveData, вам не нужно устанавливать allowMainThreadQueries()
, запросы выполняются асинхронно в фоновом потоке с LiveData, и вы можете наблюдать за ним, чтобы получать обновления в этих данных.
Вы можете разрешить запросы в основном потоке, если ваша база данных меньше по размеру и вы не выполняете никаких тяжелых операций над базой данных, в противном случае builder может заблокировать пользовательский интерфейс на длительный период времени.