Рубрики
Без рубрики

База данных комнат. Модель представления

Вступление Эта серия будет посвящена основам Android Room library…. С тегами java, android, новички, тристан.

  • Эта серия будет посвящена основам Android Room library. Я буду следовать официальному руководству Google, ЗДЕСЬ но я буду работать в том порядке, который имеет для меня больше смысла.

Что такое ViewModel

  • Класс ViewModel предназначен для хранения и управления данными, связанными с пользовательским интерфейсом, спорным способом жизненного цикла. Класс ViewModel позволяет данным выдерживать изменения конфигурации, такие как поворот экрана. По сути, это класс, который упрощает использование данных в наших компонентах пользовательского интерфейса, таких как фрагменты и действия

Проблемы, с которыми сталкивается пользовательский интерфейс

  • Платформа Android управляет жизненными циклами контроллеров пользовательского интерфейса, такими как действия и фрагменты. Платформа может принять решение уничтожить или воссоздать контроллер пользовательского интерфейса в ответ на определенные действия пользователя или события устройства, которые полностью находятся вне нашего контроля.

  • Когда система Android по какой-либо причине уничтожает и воссоздает компонент пользовательского интерфейса, это создает 2 основные проблемы

1) Восстановление данных пользовательского интерфейса: если система уничтожает или воссоздает контроллер пользовательского интерфейса, все временные данные, связанные с пользовательским интерфейсом, которые вы храните в них, теряются. Когда действие воссоздается для изменения конфигурации, новое действие должно повторно выполнить выборку данных. Чтобы решить эту проблему, мы могли бы использовать метод onSaveInstanceState() и восстановить его данные из пакета в onCreate(). Однако этот подход предназначен только для небольших объемов данных, а не для больших объемов, как мы будем использовать.

2) Асинхронные вызовы: контроллер пользовательского интерфейса должен иметь возможность управлять асинхронными вызовами и гарантировать, что система очистит их после уничтожения контроллера пользовательского интерфейса, чтобы избежать потенциальных утечек памяти. Такое управление требует большого технического обслуживания и в конечном счете является пустой тратой ресурсов, поскольку объекту придется повторно выполнять вызовы, которые он уже сделал.

Зачем использовать ViewModel?

  • Теперь контроллеры пользовательского интерфейса в первую очередь предназначены для отображения данных пользовательского интерфейса, реагирования на действия пользователя или обработки взаимодействия с операционной системой, например запросов на получение разрешений. Создание контроллеров пользовательского интерфейса, которые также обрабатывают загрузку данных из базы данных или сетевых вызовов, добавляет нежелательный беспорядок в класс. Это также является нарушением принципа разделения задач , которого мы стараемся придерживаться при программировании. Это также просто усложняет тестирование класса.

  • Гораздо лучшим и более эффективным подходом является отделение данных представления от логики контроллера пользовательского интерфейса. Мы можем сделать это, создав ViewModel

Создание ViewModel

  • Мы будем использовать класс ViewModel, который отвечает за подготовку и управление данными для наших действий или фрагментов.
  • Объекты ViewModel автоматически сохраняются во время изменений конфигурации, поэтому хранящиеся в них данные немедленно становятся доступными для следующего экземпляра activity или fragment. Это означает, что мы можем иметь большие объемы данных и выполнять только один асинхронный вызов. Решаем две наши предыдущие проблемы. Учитывая все сказанное, давайте посмотрим на код.
public class WordViewModel extends AndroidViewModel {
    private WordRepository mRepository;
    private final LiveData> mAllWords;

    public WordViewModel( Application application) {
        super(application);
        mRepository = new WordRepository(application);
        mAllWords = mRepository.getAllWords();
    }

    LiveData> getAllWords(){
        return mAllWords;
    }

    public void insert(Word word){
        mRepository.insert(word);
    }

}

открытый класс wordviewmodel расширяет AndroidViewModel

  • Первое, что вы, вероятно, заметили, это то, что вместо расширения ViewModel мы расширяем AndroidViewModel . Android View Model – это подкласс ViewModel, поэтому он выполняет все те же действия, что и ViewModel. Единственное отличие заключается в том, что AndroidViewModel предназначен для использования, когда мы используем глобальный контекст приложения, как мы. Так что просто знайте, что мы используем обзорную модель Android View Model, потому что наша программа использует контекст приложения.

частное хранилище слов mRepository;

  • Это всего лишь закрытая переменная-член типа Word Repository. Помните, что репозиторий – это уровень абстракции, который мы создали для взаимодействия с базой данных.

частные итоговые данные LiveData< Список< Слово > > Слова на стене

  • Просто еще одна частная конечная переменная-член, но она имеет тип Текущие данные , которая в конечном итоге будет использоваться для хранения обновляемого списка данных.

общедоступная WordViewModel( приложение application){…}

  • Это наш конструктор, и мы передаем ему аргумент типа Application , который является глобальным состоянием нашего приложения. Нам нужно передать ему эту переменную, потому что модель представления Android нуждается в ней для правильной работы. Вызвав super(приложение) мы вызываем открытый конструктор AndroidViewModel. Наш репозиторий Word также нуждается в этом контексте приложения.

Хранилище слов (приложение);

  • Следующее, что мы делаем внутри нашего конструктора, – это присваиваем переменной-члену mrepository фактический экземпляр нашего WordRepository. Это важно, потому что, если мы этого не сделаем, мы не сможем взаимодействовать с нашей базой данных. Также обратите внимание, что мы передаем его application это будет использоваться нашей базой данных при создании экземпляра.

.getAllWords();

  • Здесь мы присваиваем набор данных слов нашей переменной-члену smallworlds.

LiveData< Список < Слово > > получить все слова () {…}

  • Просто базовый метод получения наших данных типа Live Data. Этот метод в конечном итоге будет использоваться для подключения наших данных к нашему пользовательскому интерфейсу.

публичная пустая вставка(Word word){…}

  • Это используется для вставки сущности Word в нашу базу данных. Обратите внимание, что мы взаимодействуем с базой данных через наш репозиторий.

  • Таким образом, мы успешно создали базовую модель представления.

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

Оригинал: “https://dev.to/theplebdev/room-database-viewmodel-4pj9”