Использование комнаты без ViewModel - PullRequest
0 голосов
/ 03 мая 2018

Я только начал использовать Android Room. Единственная проблема в том, Для взаимодействия дБ требуется несколько слоев. Класс таблицы -> Интерфейс Dao -> Репо базы данных -> ViewModels

И на каждом слое есть повторение кода.

Как будто я напрямую вызываю запросы из Repo, без viewModels, это не позволит. Поскольку вызов без viewModel, наблюдатель становится синхронным, что блокирует основной поток.

Либо должен быть стандартный способ асинхронного вызова репо, либо некоторые хаки. Возможно, мы можем использовать некоторый универсальный класс Async, который позволяет передавать запросы и возвращать результат в основной поток.

Возможен взлом. Не знаю, если это правильный путь.

    AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            List<User> users = apiService.getAllUsers();
            if(users.size()>0)
            {
                System.out.println("Total users:"+users.size());
                System.out.println("Email:"+users.get(0).getEmail());
            }
        }
    });

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Если вы просто тестируете Room, просто позвоните

.allowMainThreadQueries() 

Если вы создаете настоящее приложение, нет смысла пропускать эту архитектуру Android.

0 голосов
/ 03 мая 2018

Слои, которые вы видите, объяснили здесь или в вашем приложении не вводят повторение кода, это может показаться так, но это делает ваше приложение модульным. Если ваше приложение масштабируется и вам нужно что-то повторно использовать или изменить, это будет намного проще.

И, кроме того, ViewModel не делает вызовы асинхронными. То, что заставляет их работать, это LiveData (при переносе вы возвращаете тип LiveData в классе Дао).
ViewModel служит для абстрагирования логики, не связанной с просмотром, от представления (действия или фрагмента) и позволяет данным пережить изменение конфигурации; кроме того, с ViewModel вы избежите Бога Activity, который обрабатывает все.

У вас есть несколько вариантов:

1) Вы можете использовать AsyncTask, упомянутый @EarlOfEgo для выполнения insert. И когда вы query ваша база данных, просто оберните возвращаемый тип в LiveData и все. Небольшой пример AsyncTask, взятый со страницы кодовой метки 8 :

private static class insertAsyncTask extends AsyncTask<Word, Void, Void> {

    private WordDao mAsyncTaskDao; 

    insertAsyncTask(WordDao dao) {
        mAsyncTaskDao = dao;
    }

    @Override
    protected Void doInBackground(final Word... params) {
        mAsyncTaskDao.insert(params[0]);
        return null;
    }
}

2) Если вам не нужно наблюдать за изменениями в вашей базе данных, тогда вы можете вообще избежать LiveData и обрабатывать выполнение всех запросов и вставлять вручную в отдельный поток. Или другой вариант - получить только одно обновление от LiveData и отменить регистрацию слушателя (или я считаю, что есть реализация LiveData, которая получает только одно обновление).

3) Или вы можете просто .allowMainThreadQueries()

0 голосов
/ 03 мая 2018

Вы можете использовать AsyncTask для этого без необходимости использования ViewModels.

AsyncTask.execute {
            val entity = daoInterface.queryFunction()
            ...
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...