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

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

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

我有一个 App DB、View Model、Repository、Dao 和所有其他部分,我的对象插入...但我无法调用 onCreate()数据库中列表的大小。当我试图获得 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());
            }
        }
    });
}

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

最佳答案

这是从 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();

关于java - 如何在 onCreate/主线程中获取房间列表的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50399194/

相关文章:

java - 在 Oracle ADF Faces 中获取表的渲染属性时出错

android - 您上传了一个在 Debug模式下签名的 APK。您需要在 Release模式错误中签署您的 APK

java - 如何计算来自相机(openCV)的2个传入帧之间的差异

android - 小部件上的自定义快速操作

android - 重用或重新创建观察者?

android - Room 数据库中的默认值 (Kotlin)

java - 使用短数组的 JNI java 到 Cpp

java - 还有其他方法可以用 Intent 传递复杂对象吗?

java - 多个 OnClick 事件不适用于所有对象

mysql - Room 从生成的查询中返回错误的初始化对象