如何获取Android中Room数据库的行数?

Nim*_*z14 8 android android-room

我遵循的做法是拥有一个存储库和一个Dao等。我试图通过具有一个函数来获取数据库存储库中的行数

int getNumFiles() {
    List<AFile> lst = files.getValue();  // files is of type LiveData<List<AFile>> files;
    if (lst == null) {
        return 0;
    } else {
        return lst.size();
    }
}
Run Code Online (Sandbox Code Playgroud)

lst总会评估为null。我想这与不允许我从UI线程查询数据库有关吗?我是否应该像添加或删除元素一样实现它?换句话说,在Dao中是否具有通过数据库存储库中的AsyncTask调用的函数?我对如何做这个非常简单的事情感到困惑。

这样的回答显示了一个将在道写找出哪些行数,但它并不能解释的仓库应该怎么称呼这一点。

Sho*_*omu 15

会议室数据库计数表行

@Query("SELECT COUNT(column_name) FROM tableName")
LiveData<Integer> getRowCount();
Run Code Online (Sandbox Code Playgroud)


Nim*_*z14 9

我最终这样做了(对查询使用新线程)。

在道

@Query("SELECT COUNT(id) FROM table WHERE is_checked = 1")
int getCount();
Run Code Online (Sandbox Code Playgroud)

在存储库中

int getNumFiles() {
    return afileDao.getCount();
}
Run Code Online (Sandbox Code Playgroud)

我需要的地方

    final AtomicInteger fcount = new AtomicInteger();
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            int num = f_repo.getNumFiles();
            fcount.set(num);
        }
    });
    t.setPriority(10);
    t.start();
    t.join();
    // use as fcount.get()
Run Code Online (Sandbox Code Playgroud)


M S*_*ens 5

让我们看看这是否有效。我可能不在基础上,但是我在尝试学习Room数据库以及最近一次尝试获取正在使用的表的行数时遇到了同样的问题。

(这是我的第一篇文章,因此我为这篇文章的简短而表示歉意,并欢迎建设性的想法来使它变得更好。)

从Dao开始,我使用@Query()批注声明了该方法。在这一点上,我们将定义将用于检索所需信息的查询。

@Query("SELECT COUNT(*) FROM word_table")
LiveData<Integer> getCount();
Run Code Online (Sandbox Code Playgroud)

其次,通过存储库进行此操作。存储库将调用我们的Dao类以检索信息并实质上传递查询。

public LiveData<Integer> getCount() {
    return mWordDao.getCount();
}
Run Code Online (Sandbox Code Playgroud)

第三,将其引入ViewModel。(在本例中)MainActivity将调用ViewModel,然后又从存储库中调用getCount()方法并向下追溯链。

// count
public LiveData<Integer> getCount() { return mRepository.getCount(); }
Run Code Online (Sandbox Code Playgroud)

最后,在MainActivity中创建可观察对象,就像我用LiveData <>包装器将值包裹起来一样。

    mWordViewModel.getCount().observe(this, new Observer<Integer>() {
        @Override
        public void onChanged(@Nullable Integer integer) {
            word_count.setText(String.valueOf(integer));
        }
    });
Run Code Online (Sandbox Code Playgroud)

我知道这很简单,简短并且省去了很多细节,但是在遍历了Room Database代码很多次之后,这对我来说可以显示我正在引用的数据库表中的行数。而这似乎是Room数据库打算工作的方式。

(我用作分支基础来检索行数的代码是从Google for Room Databases第I部分提供的代码库实验室中获取的。)

您可以通过以下链接访问它们,然后单击“房间数据库-第1部分: 适用于Android开发人员的代码实验室”中的链接。

史考特


Bil*_*ote 5

我不需要LiveData,我使用了Coroutine

// DAO
@Query("SELECT COUNT(*) FROM some_table")
suspend fun getCount(): Int

// REPOSITORY
fun getCount(): Int = runBlocking {
    val count = async {
        dao.getCount()
    }
    count.start()
    count.await()
}

// VIEWMODEL
when (val count = repository.getCount()) {
  // do stuff with count
}
Run Code Online (Sandbox Code Playgroud)