我有一个使用Room的Android应用程序。我需要检查表中插入的项目数,因此我已经在Dao界面中编写了以下代码
@Query("SELECT COUNT(*) FROM notes")
int getCount();
在存储库类中,我编写了类似下面的代码
public int deleteNote(final NoteEntity note) {
final int[] count1 = new int[1];
executor.execute(new Runnable() {
@Override
public void run() {
count1[0] = mDb.schoolDao().getCount();
}
});
return count1[0];
}
现在,当我在Activity
中调用上述方法时,我得到的count
为零,但是当我强制应用程序在主线程上运行时,即删除了Runnable
代码,然后返回有效的count
。我知道在主线程上触发任何数据库查询都不是一个好选择,但我不明白为什么当它在后台线程上运行时为什么计数为零。
请注意,数据库中始终有数据。
答案 0 :(得分:1)
由于count1 [0]更早返回,然后实际的数据库查询完成,因此您获得了0个计数。而不是使用数组,而是使用MutableLiveData。像这样:
@Query("SELECT COUNT(*) FROM notes") MutableLiveData< Integer> getCount();
现在,您将在代码调用后直接获得MutableLiveData实例,但是由于它为空,因此您现在将无法使用它。您需要做的是订阅新数据:
mDb.schoolDao().getCount(). observe (this, new Observer<Integer>() { @Override public void onChanged(@Nullable final Integer val {count[0]=val; }};
请注意,您不需要在后台运行此代码。只需在count []初始化之后立即订阅,当DB返回计数值时,onChanged()方法就会调用。
不确定这是错误的,但是您要在返回void的方法中返回count [0]。您确定这就是您想要的吗?