Номер базы данных наблюдателя - PullRequest
0 голосов
/ 28 января 2019

В базе данных Room я хочу добавить наблюдателя, где уведомления будут выглядеть так: удалить, вставить, обновить.

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

Но я не уверен, что это правильный способ сделать это, возможно, у rxjava есть какой-то способ сделать это?Или, может быть, DiffUtil в RecyclerView?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я предлагаю вам использовать Rxjava для него.

С помощью android.arch.persistence.room:rxjava2:1.1.1 в вашей зависимости вы можете непосредственно наблюдать изменения в вашей базе данных.

Dao.kt

  @Query("SELECT * FROM table")
    abstract fun getAllData(): Flowable<List<TableData>>

Репозиторий

fun getDataFromDb():Flowable<List<TableData>>= database.dao().getAllData()

ViewModel

repository.getDataFromDb()
.subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeBy{
                        //Todo here you will receive the data whenever there is any change in database
                     }

Также укажите на примечание

Комната знает только, что таблица была изменена, но не знает, почему и что изменилось.Следовательно, после повторного запроса результат запроса передается с помощью LiveData или Flowable.Так как Room не хранит никаких данных в памяти и не может предположить, что объекты имеют equals (), он не может определить, являются ли это те же данные или нет. Вам нужно убедиться, что ваш DAO фильтрует выбросы и реагирует только наотдельные объекты.

Если наблюдаемый запрос реализован с использованием Flowables, используйте Flowable # diverUntilChanged

   Flowable<TableData> = repository.getDataFromDb()
                          .distinctUntilChanged{previous,next-> //here you can check for difference }

. Для более подробной информации перейдите по этой ссылке

https://medium.com/androiddevelopers/7-pro-tips-for-room-fbadea4bfbd1

0 голосов
/ 28 января 2019

Вы должны возвращать объекты LiveData из ваших методов Dao для наблюдения за операциями CRUD.

LiveData будет обновляться при выполнении любой операции CRUD в вашем репо.

Затем вы можете получить обновленные данные из репозитория и отразить изменения в адаптере.

...