当 Room 数据库发生更改时,LiveData 会更新我的可观察值

And*_*Dev 0 android rx-java android-room android-livedata

我使用 LiveData 显示 Room 中表中的记录数。我调用一个函数来检索该计数,并在收到该计数后调用观察者来显示该计数。这按预期工作。但我还运行一个服务,该服务从后端检索数据并将其存储在我从中读取计数的同一个表中。但是每当存储数据时,每次都会调用可观察对象并更新显示的计数。我不知道为什么会发生这种情况。事实上我确实希望这一切发生。我只是不明白为什么会发生这种情况。当我运行代码来检索计数时,它是使用 RxJava 完成的。因此,当调用完成时,我看不出为什么计数的可观察值会随着每个数据存储而更新。唯一可能的原因是 Room 会跟踪我的计数查询并在存储数据时执行它。那可能吗?这是我获取计数的代码:

在我的片段中观察到:

viewModel.onConnectionsCountRetrieved.observe(this, Observer { count ->
    var title = getString(R.string.connections)

    if (count > 0)
        title += " (" + "%,d".format(count) + ")"

    (activity as MainActivity).getSupportActionBar()?.title = title
})
Run Code Online (Sandbox Code Playgroud)

在我的视图模型中:

val onConnectionsCountRetrieved: MutableLiveData<Int> = MutableLiveData()

@SuppressLint("CheckResult")
fun getConnectionsCount() {
    val disposable = connectionsBO.getConnectionsCount()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            { count -> onConnectionsCountRetrieved.postValue(count) },
            { ex -> App.context.displayErrorMessage(R.string.problem_retrieving_total_connection_count) }
        )

    disposables.add(disposable)
}
Run Code Online (Sandbox Code Playgroud)

Fed*_*nto 5

来自 Room文档

可观察的查询

执行查询时,您通常希望应用程序的 UI 在数据更改时自动更新。为此,请在查询方法描述中使用 LiveData 类型的返回值。当数据库更新时,Room 会生成所有必要的代码来更新 LiveData。

Room 还为 RxJava 提供相同的功能。您可以在生成的类中看到查询的实现YourDao_Impl.java