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

时间:2018-08-28 11:44:34

标签: 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();
    }
}

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

有一个this答案,该答案显示了要在Dao中写出什么以找出行数,但是并没有说明存储库应如何调用此行。

7 个答案:

答案 0 :(得分:3)

房间数据库计数表行

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

答案 1 :(得分:1)

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

在道上

@Query("SELECT COUNT(id) FROM table WHERE is_checked = 1")
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()

答案 2 :(得分:1)

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

//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。忽略替代注释。他们在那儿是因为我在演示者上强制执行。

答案 3 :(得分:0)

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

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

从Dao开始,我使用@Query()批注声明了该方法。这是我们定义要用来检索所需信息的查询的地方。

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

第二,将其携带通过存储库。存储库将调用我们的Dao类以检索信息并实质上传递查询。

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));
        }
    });

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

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

您可以通过以下链接访问它们,然后单击“房间数据库-第1部分”中的链接: Codelabs for Android Developers

斯科特

答案 4 :(得分:0)

我不需要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
}

答案 5 :(得分:0)

@Query("SELECT  COUNT(DISTINCT column_name) FROM table)
LiveData<Integer> getTotalNumberOfColumns();

将DISTINCT作为参数添加到COUNT函数。

答案 6 :(得分:0)

@Query("SELECT COUNT(column_name) FROM table)

LiveData getTotalNumberOfColumns();

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

@Query("SELECT COUNT(DISTINCT column_name) FROM table)

LiveData getTotalNumberOfColumns();