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

时间:2018-10-08 17:57:24

标签: android android-room android-jetpack

我有一个使用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。我知道在主线程上触发任何数据库查询都不是一个好选择,但我不明白为什么当它在后台线程上运行时为什么计数为零。

请注意,数据库中始终有数据。

1 个答案:

答案 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]。您确定这就是您想要的吗?