java - 如何在主线程的 onCreate/ 中获取房间列表的大小?
问题描述
如何轻松获取数据库大小的计数,以便我可以根据数据库是否为空来执行适当的操作?
我有一个 App DB、视图模型、存储库、Dao 和所有其他部分,并且我的对象插入......但我无法调用onCreate()
数据库中列表的大小。当我尝试获取mAppDatabase.vehicleDao().getAll().getValue().size()
, ormVehicleViewModel.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();
或者
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());
}
}
});
}
我可以记录我想要的所有信息。所以这些项目是明确插入的。是什么赋予了?我错过了什么?谢谢你。
解决方案
这是从 LiveData 同步访问数据:
Log.d("LISTSIZEVM", String.valueOf(mViewModel.getAll().getValue().size()));
但这些数据可能还没有到来。
尝试将此查询添加到您的 Dao,请参阅google 示例:
@Query("SELECT COUNT(column) FROM table")
int getDataCount();
正如@CommonsWare 所指出的,这不能从主 UI 线程调用,因为它是一个数据库操作,会阻塞 UI 线程并引发错误。您可以从主线程中调用它,或者返回 aLiveData<Integer>
并观察值,就像您对数据列表所做的那样。
@Query("SELECT COUNT(column) FROM table")
LiveData<Integer> getDataCount();
推荐阅读
- yii2 - 如何调试 Yii2 迁移?
- listview - Xamarin 表单列表视图 - 数据模板到列
- java - ThreadMXBean.getThreadAllocatedBytes(long id)中包含哪些JVM运行时数据区
- java - 无法使用 Java 读取包含阿拉伯语内容的 Excel 文件
- javascript - 如何在 Jquery 中多次调用一个函数来添加一个事件监听器而不只是监听最后一个?
- sql - 设置声明的参数值和 CONCAT 列名
- c - 结构指针成员的分段错误(核心转储)
- xpath - Google Sheets IMPORTXML XPath 帮助(了解如何阅读页面源代码)
- python - Python中的匹配间隔(纬度/经度)和时间
- kotlin - 获取对调用函数的类的引用