Room Database поддерживает асинхронные запросы - запросы, которые возвращают экземпляры LiveData или Flowable - исключены из этого правила, поскольку при необходимости они асинхронно запускают запрос в фоновом потоке.
ДляНапример, вместо возврата необработанных данных вы можете использовать что-то вроде этого:
@Dao
public interface MyDao {
@Query("SELECT * from user where id = :id LIMIT 1")
public LiveData<User> loadUserById(int id);
}
или
@Dao
public interface MyDao {
@Query("SELECT * from user where id = :id LIMIT 1")
public Flowable<User> loadUserById(int id);
}
Используя Flowable
, вы можете прослушивать обратный вызов, чтобы показать / скрытьдиалоговое окно прогресса выглядит следующим образом:
AppDatabase.getAppDatabase(getActivity()).deviceDao().getAllDevices()
.observeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe((Consumer<Subscription>) subscription -> {
// do something when subscribe
// show progress here
})
.doOnTerminate((Action) () -> {
// do something when success or fail
// hide progress here
})
.subscribe(device -> {
// load data success
}, throwable -> {
// do when error
});
Реактивные запросы с RxJava
Room обеспечивает следующую поддержку для возвращаемых значений типов RxJava2:
@ Методы запросов: Room поддерживает возвращаемые значения типа Publisher, Flowable и Observable.Методы @Insert, @Update и @Delete: Room 2.1.0 и выше поддерживает возвращаемые значения типа Completable, Single и Maybe.
Чтобы использовать эту функцию, включите последнюю версию rxjava2Артефакт в файле build.gradle
вашего приложения:
app/build.gradle
dependencies {
implementation 'androidx.room:room-rxjava2:2.1.0-alpha02'
}