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

How to get the row count of Room database in android?

我正在遵循拥有 Repository 和 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();
    }
}

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

答案显示了在 Dao 中会写些什么来找出行数,但它没有解释存储库应该如何调用它。

我最终是这样做的(使用新线程进行查询)。

道中

@Query("SELECT COUNT(id) FROM table")
int getCount();

在存储库中

int getNumFiles() {
    return afileDao.getCount();
}

我需要的地方

    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()

我认为在后台线程中执行微型操作的更好方法是创建 Handler & HandlerThread 并使用它们执行一个线性任务。

//The handlers to perform tasks on the background threads
override lateinit var mHandler: Handler
override lateinit var mHandlerThread: HandlerThread

override fun start() {
    //Instantiate the handlerThread
    mHandlerThread = HandlerThread(MainPresenter::class.java.simpleName)

    //A call to the start method has to be executed manually
    mHandlerThread.start()
    mHandler = Handler(mHandlerThread.looper)
}

无论你想在后台线程中调用什么,只需:

mHandler.post { getTableCountInBg() }

我正在输入 @Sameer Donga 链接到的内容,但改为引用它。像上面那样调用它。

P.S。忽略覆盖注释。他们在那里是因为我在演示者身上强制执行它。

房间数据库计数Table行

@Query("SELECT COUNT(column_name) FROM tableName")
LiveData<Integer> getRowCount();

让我们看看这是否有效。我可能偏离了基础,但我在尝试学习 Room 数据库时一直在努力解决同样的问题,最近试图获取我正在使用的 table 的行数。

(这是我的第一个 post,所以对于它的短小,我深表歉意,欢迎有建设性的想法让它变得更好。)

从 Dao 开始,我用 @Query() 注解声明了方法。我们将在此处定义用于检索所需信息的查询。

@Query("SELECT COUNT(*) FROM word_table")
LiveData<Integer> getCount();

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

public LiveData<Integer> getCount() {
    return mWordDao.getCount();
}

第三,将其带入ViewModel。 ViewModel 将由(在本例中)MainActivity 调用,然后将从存储库调用 getCount() 方法并返回链中。

// count
public LiveData<Integer> getCount() { return mRepository.getCount(); }

最后,在 MainActivity 中创建可观察对象,因为我用 LiveData<> 包装器封装了值。

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

我知道这很简单、简短并且遗漏了很多细节,但是在多次检查房间数据库代码之后,这对我来说很有效,能够显示数据库 table 我正在引用。这似乎是 Room 数据库的工作方式。

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

您可以通过以下 link 联系他们,然后单击房间数据库 - 第 1 部分: Codelabs for Android Developers

斯科特

我不需要 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
}
@Query("SELECT  COUNT(DISTINCT column_name) FROM table)
LiveData<Integer> getTotalNumberOfRows();

将 DISTINCT 添加为 COUNT 函数的参数。

@Query("SELECT COUNT(column_name) 来自 table)

LiveData getTotalNumberOfColumns();

如果您不想在列中多次出现某个值,则执行此操作

@Query("SELECT COUNT(DISTINCT column_name) 来自 table)

LiveData getTotalNumberOfColumns();