簡體   English   中英

如何在Android中使用沒有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也會更好。

特別是,只要您僅將AsyncTaskdoInBackground()一起使用,與簡單線程相比,就不需要使用AsyncTask 使用AsyncTask唯一原因是因為您需要onPostExecute()在主應用程序線程上做一些工作。

而且,由於AsyncTask被認為已過時,所以我真的鼓勵您使用其他方法。 Room內置了對LiveData ,Kotlin協程和RxJava的支持。

如果我同時觸發兩個或多個查詢,則需要一種機制來確保所有asyncTasks都完成,就像onFinishedAllLoadingListener一樣。 做這個的最好方式是什么?

就您而言,只需將它們放在一個線程中即可。 由於AsyncTask默認使用單個后台線程,因此您的代碼AsyncTask不會同時有兩個或多個查詢。

在其他可能的解決方案方面:

  • 對於Kotlin協程,可能async()await()是最簡單的選項

  • 對於RxJava,如EpicPandaForce建議的那樣,使用zip()運算符

  • 使用LiveData ,請使用提供zip()運算符的庫 ,或創建自己的庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM