Сохраняйте данные в локальной базе данных, используя компонент Room из Android Jetpack .
Приложения, обрабатывающие значительные объемы структурированных данных, могут получить большую выгоду от локального хранения этих данных. Наиболее распространенный вариант использования — кэширование важных фрагментов данных, чтобы пользователи могли просматривать контент в автономном режиме, даже если устройство не имеет доступа к сети.
Библиотека Room для работы с данными предоставляет уровень абстракции над SQLite, обеспечивая удобный доступ к базе данных и используя все возможности SQLite. В частности, Room предоставляет следующие преимущества:
- Проверка SQL-запросов на этапе компиляции.
- Удобные аннотации, которые минимизируют повторяющийся и подверженный ошибкам шаблонный код.
- Упрощенные пути миграции баз данных.
Мы рекомендуем использовать Room вместо прямого использования API SQLite .
Настраивать
Чтобы использовать Room в вашем приложении, добавьте следующие зависимости в файл build.gradle.kts вашего модуля. Room 3.0 требует KSP для обработки аннотаций.
Котлин
dependencies { val room_version = "3.0.1" implementation("androidx.room3:room3-runtime:$room_version") ksp("androidx.room3:room3-compiler:$room_version") }
Классный
dependencies { def room_version = "3.0.1" implementation "androidx.room3:room3-runtime:$room_version" ksp "androidx.room3:room3-compiler:$room_version" }
Основные компоненты
В Room есть три основных компонента:
- Класс базы данных , который содержит саму базу данных и служит основной точкой доступа для подключения к сохраненным данным вашего приложения.
- Сущности данных , представляющие таблицы в базе данных вашего приложения.
- Объекты доступа к данным (DAO) предоставляют функции, которые ваше приложение может использовать для запроса, обновления, вставки и удаления данных в базе данных.
Класс базы данных предоставляет вашему приложению экземпляры DAO, связанных с этой базой данных. В свою очередь, приложение может использовать DAO для извлечения данных из базы данных в виде экземпляров соответствующих объектов сущностей данных. Приложение также может использовать определенные сущности данных для обновления строк в соответствующих таблицах или для создания новых строк для вставки. На рисунке 1 показана взаимосвязь между различными компонентами Room.

Пример реализации
В этом разделе представлен пример реализации базы данных Room с одной сущностью данных и одним DAO.
сущность данных
Приведенный ниже код определяет сущность данных User . Каждый экземпляр User представляет собой строку в таблице user в базе данных приложения.
@Entity data class User( @PrimaryKey val uid: Int, @ColumnInfo(name = "first_name") val firstName: String, @ColumnInfo(name = "last_name") val lastName: String )
Чтобы узнать больше о сущностях данных в Room, см. раздел «Определение данных с помощью сущностей Room» .
Объект доступа к данным (DAO)
Приведённый ниже код определяет объект DAO под названием UserDao . UserDao предоставляет функции, которые остальная часть приложения использует для взаимодействия с данными в таблице user .
@Dao interface UserDao { @Query("SELECT * FROM user") suspend fun getAll(): List<User> @Query("SELECT * FROM user WHERE uid IN (:userIds)") suspend fun loadAllByIds(userIds: IntArray): List<User> @Query( """ SELECT * FROM user WHERE first_name LIKE :first AND last_name LIKE :last LIMIT 1 """ ) suspend fun findByName(first: String, last: String): User @Insert suspend fun insertAll(vararg users: User) @Delete suspend fun delete(user: User) }
Чтобы узнать больше о DAO, см. раздел «Доступ к данным с помощью DAO в комнатах» .
База данных
Приведённый ниже код определяет класс AppDatabase для хранения базы данных. AppDatabase определяет конфигурацию базы данных и служит основной точкой доступа приложения к сохраняемым данным. Класс базы данных должен удовлетворять следующим условиям:
- Класс должен быть аннотирован аннотацией
@Database, которая включает массивentities, содержащий список всех сущностей данных, связанных с базой данных. - Класс должен быть абстрактным классом, наследующим
RoomDatabase. - Для каждого класса DAO, связанного с базой данных, класс базы данных должен определить абстрактную функцию, которая не принимает аргументов и возвращает экземпляр класса DAO.
@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
Примечание: Если ваше приложение работает в одном процессе, при создании экземпляра объекта AppDatabase следует придерживаться шаблона проектирования Singleton. Каждый экземпляр RoomDatabase довольно затратен, и вам редко требуется доступ к нескольким экземплярам в рамках одного процесса.
Если ваше приложение работает в нескольких процессах, добавьте метод enableMultiInstanceInvalidation() в вызов построителя базы данных. Таким образом, когда в каждом процессе есть экземпляр AppDatabase , вы можете аннулировать общий файл базы данных в одном процессе, и эта аннулирование автоматически распространится на экземпляры AppDatabase в других процессах.
Использование
После определения сущности данных, объекта DAO и объекта базы данных, вы можете использовать следующий код для создания экземпляра базы данных:
val db = Room.databaseBuilder<AppDatabase>(applicationContext, "database-name") .setDriver(AndroidSQLiteDriver()) .build()
Затем вы можете использовать абстрактные функции из AppDatabase , чтобы получить экземпляр DAO. В свою очередь, вы можете использовать функции из экземпляра DAO для взаимодействия с базой данных:
val userDao = db.userDao() val users: List<User> = userDao.getAll()
Дополнительные ресурсы
Чтобы узнать больше о Room, ознакомьтесь со следующими дополнительными ресурсами:
