Android Room-使用LiveData进行SELECT查询

时间:2018-11-28 14:46:12

标签: android

我无法使用类别和日期列获取行的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?

2 个答案:

答案 0 :(得分:0)

当您观察LiveData中的mViewModel对象时,并不意味着onChanged会立即返回。如果LiveData对象已经有一个值,则可以立即获得它,但不能保证。

您实际上要做的是观察随时可能发生的变化。在您的情况下,这是一个数据库请求,需要一段时间才能完成返回值。

答案 1 :(得分:0)

LiveData异步工作。 如果要同步结果(按顺序执行),则不能使用LiveData。 您可以在构建像这样的数据库时使用allowMainThreadQueries()

Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME).allowMainThreadQueries().build()

但这是完全不推荐的。 选择数据的过程将阻塞主线程。 您应该花一些时间阅读LiveData文档以及异步的工作方式。