如何获取 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();
我正在遵循拥有 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 调用的?我对如何做这个非常简单的事情感到困惑。
有
我最终是这样做的(使用新线程进行查询)。
道中
@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();