如何在Android中使用没有LiveData的房间和数据库?

时间:2019-04-02 23:00:56

标签: java android database

我是新来的房间,我想为我的应用程序建立数据库。我在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中?

1 个答案:

答案 0 :(得分:0)

  

如何在不使用LiveData概念的情况下从数据库中检索数据?

请勿使用LiveData作为DAO方法的返回类型。

  

据我所知,查询不应该在主线程上。所以我必须将其放入asyncTask

LiveData相比,使用AsyncTask,Kotlin协程或RxJava会更好。鉴于此代码似乎位于存储库中而不与UI绑定,即使是普通的Thread或单线程Executor也会更好。

尤其是,与简单线程相比,每次只将AsyncTaskdoInBackground()一起使用时,就不需要使用AsyncTask。使用AsyncTask唯一原因是因为您需要onPostExecute()在主应用程序线程上做一些工作。

而且,由于AsyncTask被认为已过时,所以我真的鼓励您使用其他方法。 Room内置了对LiveData,Kotlin协程和RxJava的支持。

  

如果我同时触发两个或多个查询,则需要一种机制来确保所有asyncTasks都完成,就像onFinishedAllLoadingListener一样。最好的方法是什么?

在您的情况下,只需将它们放在一个线程中即可。您的代码无论如何不会同时有两个或多个查询,因为AsyncTask默认使用单个后台线程。

关于其他可能的解决方案:

  • 对于Kotlin协程,可能async()await()是最简单的选择

  • 对于RxJava,如EpicPandaForce所建议,请使用zip()运算符

  • 通过LiveData,使用提供zip()运算符的a librarycreate your own