当 运行 在后台线程上时,房间计数查询没有结果

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]。你确定这是你想要的吗?