有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在onCreate/on主线程中获取文件室列表的大小?

如何轻松获得数据库大小的计数,以便根据数据库是否为空执行适当的操作

我有一个应用程序数据库,视图模型,存储库,Dao和所有其他部分,我的对象插入。。。但是我不能调用数据库中列表的大小。当我试图获取mAppDatabase.vehicleDao().getAll().getValue().size()mVehicleViewModel.getAll().getValue().size()时,会出现空指针异常

但是我知道我的对象正在插入,因为当我运行一个可观察对象时,我可以记录它们的信息。。。但是我无法在onCreate中获取主线程的计数。帮助示例代码如下:

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

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

^Null pointer exception for both (Attempt to invoke interface method 'java.lang.Object[] java.util.List.toArray()' on a null object reference)...

然而:

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) 个答案

  1. # 1 楼答案

    这是从LiveData同步访问数据:

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

    但这些数据可能还没有到达

    尝试将此查询添加到Dao,请参见google samples

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

    正如@commonware所指出的,这不能从主UI线程调用,因为它是一个数据库操作,会阻塞UI线程并抛出错误。您可以取消主线程的调用,或者返回一个LiveData<Integer>并观察该值,就像您对数据列表所做的那样

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