如何在onCreate /主线程上获取房间列表的大小?

时间:2018-05-17 19:28:04

标签: java android android-room android-architecture-components android-jetpack

如何轻松获取数据库大小的计数,以便我可以根据数据库是否为空来执行相应的操作?

我有一个App DB,View Model,Repository,Dao和所有其他部分,我的对象插入......但是我不能在onCreate()中调用DB中列表的大小。当我尝试获取mAppDatabase.vehicleDao().getAll().getValue().size()mVehicleViewModel.getAll().getValue().size()时,我会得到空指针异常。

但是我知道我的对象是插入的,因为当我运行一个observable时,我可以记录他们的信息......但是我无法计算onCreate中的主线程/。救命!示例代码如下:

protected void onCreate(Bundle savedInstanceState) {
...
mAppDatabase = AppDatabase.getInstance(MyActivity.this);
Log.d("LISTSIZEAPP", String.valueOf(mAppDatabase.myDao().getAll().getValue().size()));
ObserveItems();

OR

protected void onCreate(Bundle savedInstanceState) {
...
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
Log.d("LISTSIZEVM",  String.valueOf(mViewModel.getAll().getValue().size()));
ObserveItems();
  

^两者都为空指针异常(尝试调用接口方法   '对象上的'java.lang.Object [] java.util.List.toArray()'   参考)...

但是:

private void ObserveItems() {
    mViewModel.getAll().observe(this, new Observer<List<Foo>>() {
        @Override
        public void onChanged(@Nullable final List<Foo> foos) {
            mFoos= foos;
            for (Vehicle v: mFoos) {
                Log.d("ROOM INFO - FOOS", v.getFooTitle());
            }
        }
    });
}

我可以记录我想要的所有信息。所以项目被清楚地插入。是什么赋予了?我错过了什么?谢谢。

1 个答案:

答案 0 :(得分:1)

这是从LiveData同步访问数据:

Log.d("LISTSIZEVM",  String.valueOf(mViewModel.getAll().getValue().size()));

但是这些数据可能尚未到来。

尝试将此查询添加到您的Dao,请参阅google samples

@Query("SELECT COUNT(column) FROM table")
int getDataCount();

正如@CommonsWare所指出的那样,无法从主UI线程调用它,因为它是一个数据库操作,它将阻止UI线程并抛出错误。您可以从主线程调用此函数,或者返回LiveData<Integer>并观察值,就像您对数据列表所做的那样。

@Query("SELECT COUNT(column) FROM table")
LiveData<Integer> getDataCount();