当 运行 在后台线程上时,房间计数查询没有结果
Room Count Query gives no result when ran on background thread
我有一个使用 Room 的 Android 应用程序。我需要检查在我的 table 中插入的项目的计数是多少,所以我在我的 Dao 界面中编写了以下代码
@Query("SELECT COUNT(*) FROM notes")
int getCount();
在我的存储库中 class 我编写了如下代码
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
代码,那么它 returns 有效 count
。我知道在主线程上触发任何数据库查询都不是一个好的选择,但我不明白为什么在后台线程上 运行s 时我得到的计数为零。
需要说明的是,数据库中始终有数据。
您的计数为 0,因为 count1[0] returned 早于实际数据库查询完成。而不是使用数组使用 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 return 将调用计数值 onChanged() 方法时。
不确定这是不是错误,但您在 return 无效的方法中 return 计数 [0]。你确定这是你想要的吗?
我有一个使用 Room 的 Android 应用程序。我需要检查在我的 table 中插入的项目的计数是多少,所以我在我的 Dao 界面中编写了以下代码
@Query("SELECT COUNT(*) FROM notes")
int getCount();
在我的存储库中 class 我编写了如下代码
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
代码,那么它 returns 有效 count
。我知道在主线程上触发任何数据库查询都不是一个好的选择,但我不明白为什么在后台线程上 运行s 时我得到的计数为零。
需要说明的是,数据库中始终有数据。
您的计数为 0,因为 count1[0] returned 早于实际数据库查询完成。而不是使用数组使用 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 return 将调用计数值 onChanged() 方法时。
不确定这是不是错误,但您在 return 无效的方法中 return 计数 [0]。你确定这是你想要的吗?