![](/img/trans.png)
[英]android - Check if the room database is populated on startup without Livedata
[英]How to use room and databases without LiveData in android?
我是新手,我想為我的應用程序建立數據庫。 我在developer.android.com上瀏覽了關於紀錄片的記錄。 我寫了一個使用LiveData的小應用程序,它運行良好。 每當數據庫更改時,基礎數據模型也會更改。
但是對於新應用程序,我不需要LiveData功能。 我有一組存儲在數據庫中的數據,應用程序無法更改。 因此,它或多或少是靜態的。 如何在不使用LiveData概念的情況下從數據庫中檢索數據?
這將是第一個猜測:
dao.getAllItems();
據我所知,查詢不應該在主線程上。 因此,我必須將其放在asyncTask中:
public class Repository {
private dbDao mDao;
private List<Items> mAllItems;
public Repository(Application application) {
DB db = DB.getDatabase(application);
mDao = db.dao();
new queryAsyncTask(mDao).execute(mAllItems);
}
private static class queryAsyncTask extends AsyncTask<List<Items>, Void, Void> {
private dbDao mAsyncTaskDao;
queryAsyncTask(dbDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Void doInBackground(List<Items>... params) {
params[0] = mAsyncTaskDao.getAllItems();
return null;
}
}
}
這使我想到下一個問題。 如果我同時觸發兩個或多個查詢,則需要一種機制來確保所有asyncTasks都完成,就像onFinishedAllLoadingListener一樣。 做這個的最好方式是什么? 或者有沒有更簡單的方法來解決我的問題而無需將每個查詢包裝在單獨的asyncTask中?
如何在不使用LiveData概念的情況下從數據庫中檢索數據?
不要將LiveData
用作DAO方法的返回類型。
據我所知,查詢不應該在主線程上。 所以我必須將其放在asyncTask中
這將是更好的為你使用LiveData
,科特林協程,或RxJava比AsyncTask
。 鑒於此代碼似乎位於存儲庫中,而不是與UI綁定在一起,所以即使是普通Thread
或單線程Executor
也會更好。
特別是,只要您僅將AsyncTask
與doInBackground()
一起使用,與簡單線程相比,就不需要使用AsyncTask
。 使用AsyncTask
的唯一原因是因為您需要onPostExecute()
在主應用程序線程上做一些工作。
而且,由於AsyncTask
被認為已過時,所以我真的鼓勵您使用其他方法。 Room內置了對LiveData
,Kotlin協程和RxJava的支持。
如果我同時觸發兩個或多個查詢,則需要一種機制來確保所有asyncTasks都完成,就像onFinishedAllLoadingListener一樣。 做這個的最好方式是什么?
就您而言,只需將它們放在一個線程中即可。 由於AsyncTask
默認使用單個后台線程,因此您的代碼AsyncTask
不會同時有兩個或多個查詢。
在其他可能的解決方案方面:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.