【发布时间】: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