Номер базы данных Запрос из фона Тема - PullRequest
0 голосов
/ 03 мая 2018

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

Я бы хотел использовать LiveData вместо RxJava или AsyncTask.

Для этого в моем классе репозитория у меня есть функция getSomeData (), которая возвращает LiveData>, и я вызываю эту функцию в моем конструкторе viewModel:

private var mObservableSomeData: LiveData<List<SomeData>>

init {
    mObservableSomeData = repository.getSomeData()
}

fun getSomeData(): LiveData<List<SomeData>> {
    return mObservableSomeData
}

Однако вылетает, говоря:

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

Что мне делать?

Ответы [ 2 ]

0 голосов
/ 18 июля 2018

Как отмечает @LieForBananas, наиболее вероятно, что вы получаете ошибку при выполнении вставки. Всякий раз, когда у вас есть @Query и вы оборачиваете возвращенные данные в наблюдаемую, например, LiveData или Flowable, ваш запрос по умолчанию выполняется в фоновом потоке.

Помните, что Room Database гарантирует, что запрос, возвращающий наблюдаемый, выполняется в фоновом потоке. Вот почему, если вы переносите возвращаемое значение в Flowable, вам не нужно явно писать .subscribeOn (Schedulers.io) при создании обозревателя. Принимая во внимание, что если вы используете Flowable для сетевого вызова (Single может быть лучше, потому что обычно нам нужно излучать только один раз), то вам нужно явно написать .subscribeOn (Scheduler.io ()), чтобы запустить вызов в фоновом потоке.

0 голосов
/ 03 мая 2018

Комната не разрешает работу базы данных в главном потоке, если вы не разрешите базу данных в главном потоке с помощью allowMainThreadQueries().

MyApp.database = Room.databaseBuilder(this,AppDatabase::class.java,"MyDatabase")
                     .allowMainThreadQueries()
                     .build()
...