Узнайте, как использовать Room для сохранения данных в локальной базе данных.
В этом рассказе вы познакомитесь с основами Room в Android. Обратите внимание: в этой истории я предполагаю, что у вас есть некоторые знания в области разработки Android и Kotlin, а это означает, что я не буду здесь объяснять простые языковые вещи.
Примечание
В этой истории мы не будем создавать пример приложения. Я просто покажу несколько отрывков с их пояснениями.
Если вы хотите создать пример приложения для Android с использованием Room и других сложных концепций, вам придется подождать. Я планирую написать об этом рассказ.
Объявление
Я только что немного обновил дизайн изображения рассказа, теперь он стал немного темнее, но ярче, и теперь изображение темы, о которой рассказывается.
Хотел бы получить отзывы об изображении истории!
Давайте начнем!
Что такое комната?
Room - это часть компонентов архитектуры Android, которая обеспечивает уровень абстракции над SQLite, что обеспечивает более надежный доступ к базе данных, при этом обеспечивая полную мощность SQLite.
По сути, это просто улучшенная версия SQLite, специально улучшенная для Android.
Вот что говорится в официальной документации Android о Room:
Библиотека сохраняемости Room обеспечивает уровень абстракции над SQLite, чтобы обеспечить свободный доступ к базе данных, используя всю мощь SQLite. В частности, Room предоставляет следующие преимущества:
- Проверка SQL-запросов во время компиляции.
- Удобные аннотации, сводящие к минимуму повторяющийся и подверженный ошибкам шаблонный код.
- Оптимизированные пути миграции базы данных.
Из-за этих соображений мы настоятельно рекомендуем использовать Room вместо непосредственного использования API SQLite.
Зависимости комнат и как это работает
Хорошо, теперь, когда мы знаем, что такое Room, давайте посмотрим, как мы добавляем ее в наш проект и как она работает.
Зависимости от комнат
Первые implementation
и annotationProcessor
необходимы для использования Room. Необязательные зависимости не всегда требуются, и вы должны добавлять их только в том случае, если вам действительно нужны эти функции.
Как работает комната
Три основных компонента Room:
- Сущность: представляет таблицу в базе данных комнат. Он должен быть помечен
@Entity
. - DAO: интерфейс, содержащий методы доступа к базе данных. Он помечен
@Dao
. - База данных: представляет базу данных. Это объект, который поддерживает соединение с базой данных SQLite, и все операции выполняются через него. Он помечен
@Database
.
Обратите внимание, что Room - это не ORM; вместо этого это целая библиотека, которая позволяет нам более легко создавать базы данных SQLite и управлять ими.
Используя аннотации, мы можем определять наши базы данных, таблицы и операции. Room автоматически переведет эти аннотации в инструкции и запросы SQLite для выполнения соответствующих операций в ядре базы данных.
Так выглядит архитектура помещения:
Реализация помещения
Теперь давайте посмотрим, как мы реализуем Room в нашем приложении.
Обратите внимание, что эти примеры будут довольно простыми, и на самом деле вы можете сделать гораздо больше, чем я покажу вам в этой истории. Поэтому не забудьте позже проверить документацию по Room, чтобы узнать больше о Room и о том, как его реализовать.
Сущности
Давайте создадим Phone
объект, чтобы увидеть, как мы создаем объекты в Room. Каждый экземпляр Phone
представляет собой строку в phone
таблице в базе данных приложения.
Довольно просто, правда?
По умолчанию Room будет использовать имя поля в качестве имени столбца. Но если вы хотите дать своему столбцу другое имя, вы можете использовать @ColumnInfo
.
Я не думаю, что мне нужно объяснять, что @PrimaryKey
, поскольку вы, вероятно, это знаете, если у вас есть немного знаний о базах данных.
А теперь перейдем к DAO.
DAO
Следующий код определяет DAO с именем PhoneDao
. PhoneDao
предоставляет методы, которые остальная часть приложения использует для взаимодействия с данными в phone
таблице.
Обратите внимание на несколько моментов:
- Все DAO должны быть аннотированы
@Dao
. - Функция, помеченная
@Insert
,@Update
или@Delete
, должна получить экземпляр желаемого класса в качестве параметра, который представляет объект, который мы хотим вставить, обновить или удалить соответственно. - В случае операций вставки или обновления мы можем использовать свойство
onConflict
, чтобы указать, что делать, когда возникает конфликт при выполнении операции. Доступны следующие стратегии:REPLACE
,ABORT
,FAIL
,IGNORE
иROLLBACK
. - Если мы хотим получить конкретную информацию от одной или нескольких сущностей, мы можем аннотировать функцию с помощью
@Query
и предоставить сценарий SQL в качестве параметра.
Теперь давайте посмотрим, как мы на самом деле создаем нашу базу данных.
База данных
Опять же, здесь есть кое-что, на что стоит обратить внимание:
- Это абстрактный класс, который должен расширяться
RoomDatabase
. - Он должен быть аннотирован
@Database
, и он получает список сущностей со всеми классами, составляющими базу данных, и все эти классы должны быть аннотированы@Entity
). Мы также должны предоставить версию базы данных. - Мы должны объявить абстрактную функцию для каждой из сущностей, включенных в аннотацию
@Database
. Эта функция должна возвращать соответствующий DAO, который является классом, помеченным@Dao
.
Использование комнаты
Самая сложная часть сделана. Все, что осталось сделать, это просто использовать Room в любом месте нашего приложения.
Вот как вы создаете экземпляр своей базы данных Room. Довольно просто, правда?
И как мы на самом деле его используем? Что ж, это тоже довольно просто.
Вот и все. Теперь у вас есть полностью функционирующая база данных Room, готовая к расширению!
Круто, не правда ли?
Последние мысли
Вы только что узнали, как добавить Room в ваше приложение и как на самом деле его использовать.
Надеюсь, эта история вам помогла. Я хотел бы услышать, нравится ли вам Room и планируете ли вы использовать его в своих будущих проектах.
Вот и все. Спасибо, что прочитали этот рассказ!
Если вам понравилась история, не забудьте аплодировать ей! И не стесняйтесь спрашивать меня о чем угодно.
Подпишись на меня в Твиттере:
Поддержите меня на Patreon: