【问题标题】:How does Room notifies the UI that the data has changed?Room 如何通知 UI 数据已更改?
【发布时间】:2017-06-18 11:14:12
【问题描述】:

我有这个问题:

@Query("SELECT * FROM Movie")
LiveData<List<Movie>> getAll();

这是我的 ViewModel:

public class MainActivityViewModel extends ViewModel {

    @Inject AppDatabase db;
    private LiveData<List<Movie>> data;

    public MainActivityViewModel() {
        MovieApp.graph().inject(this);
        data = db.movieDao().getAll();
    }

    LiveData<List<Movie>> getData() {
        return data;
    }
}

在我的 Activity 的 onCreate 中,我调用:

viewModel.getData().observe(this, adapter::setMovies);

JobService 中,我下载了一个 Json 并将其转换为 Room 对象并调用

db.movieDao().insertAll(movies.results);

但什么也没发生 :-(

我必须手动触发 Room 刷新还是会自动为我触发 Room?我错过了什么吗?

编辑:

我添加了一些注销,这是到目前为止按此顺序发生的情况:

  • MainActivityViewModel 创建并调用 db.movieDao().getAll()
  • Activity 观察 ViewModel viewModel.getData().observe(this, adapter::setMovies)
  • setMovies 使用 0 个数据调用
  • 几秒钟后 JobService 已启动,加载数据并调用 db.movieDao().insertAll(movies.results)

此时我预计 Room 会进行刷新调用,因为数据库数据已更改但没有任何反应。

【问题讨论】:

  • setMovies 确实打电话给notifyDataSetChanged(),对吧?
  • @EpicPandaForce 是的。但它只在没有数据的情况下调用一次,并且在下载开始之前。下载完成后不会再次调用它。当我重新启动应用程序时,我会看到上次运行的下载内容。
  • 您是否在两个地方都使用相同的RoomDatabase 实例?例如,如果您的 JobService 与 UI 代码处于单独的进程中,则根据定义,它们是单独的 RoomDatabase。实例。
  • 非常感谢@CommonsWare。我在 Dagger 模块中忘记了 @Singleton 注释。
  • 很高兴你解决了它!但是,不要使用解决方案编辑问题,而是考虑发布您自己的问题答案,然后(稍后)将其标记为已接受。这样,当您的问题和解决方案出现在搜索和其他内容中时,您的问题及其解决方案将更加明显。

标签: java android android-room


【解决方案1】:

问题是我的应用创建了两个 Room 实例,因为我忘记了 @Singleton annotation in my Dagger module

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多