我无法使用类别和日期列获取行的ID。每当我使用LiveData观察方法更新我的int id
时,观察方法都会最后执行。
例如代码:
if(duplicate) {
Log.e("FIRST: ", "ID: " + id);
mViewModel.getId(category, date).observe(getActivity(), new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer integer) {
id = integer;
Log.e("SECOND", "ID " + id);
}
});
Log.e("THIRD: ", "ID: " + id);
}
Log.v("LOG: ", "ID: " + id);
这是Logcat的结果:
第一:ID:0
第三名:ID:0
日志:: ID:0
第二:ID 1
为什么在mViewModel.getId(category, date).observe...
之后执行Log.v
中的代码?以及如何将THIRD和LOG中的ID设置为与SECOND(又名1)相同?
我在ViewModel中的代码:
LiveData<Integer> getId(String cat, String date) {return mRepository.getId(cat, date); }
我在存储库中的代码:
LiveData<Integer> getId(String cat, String date) {return mBudgetDao.getId(cat, date); }
我在我的代码中的代码:
@Query("SELECT id FROM budget_table WHERE category = :category AND date = :date")
LiveData<Integer> getId(String category, String date);
是否还有其他方法可以通过查询而不在数据库中使用allowMainThreadQueries()
来获取ID?
答案 0 :(得分:0)
当您观察LiveData
中的mViewModel
对象时,并不意味着onChanged
会立即返回。如果LiveData
对象已经有一个值,则可以立即获得它,但不能保证。
您实际上要做的是观察随时可能发生的变化。在您的情况下,这是一个数据库请求,需要一段时间才能完成返回值。
答案 1 :(得分:0)
LiveData异步工作。 如果要同步结果(按顺序执行),则不能使用LiveData。 您可以在构建像这样的数据库时使用allowMainThreadQueries()
Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME).allowMainThreadQueries().build()
但这是完全不推荐的。 选择数据的过程将阻塞主线程。 您应该花一些时间阅读LiveData文档以及异步的工作方式。