Сохраняйте данные в локальной базе данных, используя компонент Room из Android Jetpack .

Попробуйте Kotlin Multiplatform.
Kotlin Multiplatform позволяет использовать один и тот же слой базы данных с другими платформами. Узнайте, как настроить и работать с базой данных Room в KMP.

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

Библиотека 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.

Рисунок 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, ознакомьтесь со следующими дополнительными ресурсами:

Образцы