Сравнение текущих значений с последними значениями в компоненте архитектуры - PullRequest
0 голосов
/ 22 декабря 2018

Я получаю комплекс json от api и сохраняю значения с помощью Architect component(Room).

Вопрос:

  • Могу ли я сравнить текущие значения споследние значения, которые я сохранил в SQlite, и если в сравнении я найду разницу, обновите RecyclerView?
  • Логичен ли этот метод?
  • Есть ли у вас лучший способ предложить?
  • Если у вас есть лучший способ предложить мне образец (url sample)

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Вы можете объединить несколько живых источников данных с сервера и sqlite с MediatorLiveData, который является подклассом LiveData.

Например, если в вашем пользовательском интерфейсе есть объект LiveData, который можно обновить из локальной базы данных или сети, вы можете добавить следующие источники в объект MediatorLiveData:

A LiveData object associated with the data stored in the database.
A LiveData object associated with the data accessed from the network.

Документация

0 голосов
/ 22 декабря 2018

Да, вы можете сделать это, и это действительно рекомендуемый способ.Для этого, я думаю, вам следует использовать два других компонента архитектуры, которые были представлены в Android Jetpack, не только Room база данных: ViewModel и LiveData , но ине является обязательным

Важно добавить в приложение дополнительный слой с именем Repository:

Репозиторий Модули обрабатывают операции с данными.Они предоставляют чистый API, так что остальная часть приложения может легко получить эти данные.Они знают, откуда взять данные и какие вызовы API следует выполнять при обновлении данных.Вы можете рассматривать репозитории как посредники между различными источниками данных, такими как постоянные модели, веб-службы и кэши.

Таким образом, в принципе, предлагаемая архитектура для обработки этого будет выглядеть примерно так:

Android recommended architecture

Имея это в виду, пример репозитория, который извлекает данные пользователя из веб-службы и сохраняет их в локальной базе данных комнат, будет выглядеть примерно так:

public class UserRepository {
    private final Webservice webservice;
    private final UserDao userDao;
    private final Executor executor;

    public UserRepository(Webservice webservice, UserDao userDao, Executor executor) {
        this.webservice = webservice;
        this.userDao = userDao;
        this.executor = executor;
    }

    public LiveData<User> getUser(String userId) {
        refreshUser(userId);
        // Returns a LiveData object directly from the database.
        return userDao.load(userId);
    }

    private void refreshUser(final String userId) {
        // Runs in a background thread.
        executor.execute(() -> {
            // Check if user data was fetched recently.
            boolean userExists = userDao.hasUser(FRESH_TIMEOUT);
            if (!userExists) {
                // Refreshes the data.
                Response<User> response = webservice.getUser(userId).execute();

                // Check for errors here.

                // Updates the database. The LiveData object automatically
                // refreshes, so we don't need to do anything else here.
                userDao.save(response.body());
            }
        });
    }
}

Затем ваша ViewModel получит Пользовательские данные в реальном времени, выполнив что-то вроде этого:

...
user = userRepo.getUser(userId);
...

И предоставит эти LiveData слою пользовательского интерфейса с помощью открытого метода:

...
public LiveData<User> getUser() {
        return this.user;
}
...

Наконец, со своего уровня пользовательского интерфейса (действия или фрагмента) вы можете наблюдать LiveData в ViewModel и соответствующим образом адаптировать пользовательский интерфейс.

viewModel.getUser().observe(this, user -> {
      // Update UI.
});

ДляБолее полное объяснение Я предлагаю вам взглянуть на:

  1. Руководство по архитектуре приложения на веб-сайте разработчиков Android.
  2. Этот проект GithubвесЭто базовый пример.
  3. Этот другой проект Github с более сложным примером.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...