Из каких компонентов состоит библиотека Room?android-16

Room - это абстракция над SQLite, которая предоставляет удобный способ работы с базой данных в Android. Библиотека состоит из трех основных компонентов, которые работают вместе для обеспечения удобного доступа к данным.

1. Entity

@Entity(tableName = "users")
data class User(
    @PrimaryKey(autoGenerate = true) val id: Int,
    @ColumnInfo(name = "user_name") val name: String,
    @ColumnInfo val age: Int,
    @Ignore val temporaryNote: String?
)

Назначение:

  • Представляет таблицу в базе данных
  • Каждый экземпляр класса - запись в таблице
  • Аннотации определяют структуру таблицы

Ключевые аннотации:

  • @Entity - помечает класс как сущность
  • @PrimaryKey - определяет первичный ключ
  • @ColumnInfo - настраивает колонки таблицы
  • @Ignore - исключает поле из таблицы

2. DAO

@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User)

    @Update
    suspend fun update(user: User)

    @Delete
    suspend fun delete(user: User)

    @Query("SELECT * FROM users")
    fun getAllUsers(): LiveData<List<User>>

    @Query("SELECT * FROM users WHERE age > :minAge")
    fun getUsersOlderThan(minAge: Int): Flow<List<User>>
}

Назначение:

  • Определяет методы для доступа к данным
  • Содержит SQL-запросы и операции CRUD
  • Может возвращать LiveData/Flow для реактивного программирования

Ключевые аннотации:

  • @Dao - помечает интерфейс как DAO
  • @Insert, @Update, @Delete - стандартные операции
  • @Query - для произвольных SQL-запросов
  • Поддержка Kotlin coroutines (suspend)

3. Database

@Database(
    entities = [User::class, Product::class],
    version = 1,
    exportSchema = false
)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
    abstract fun productDao(): ProductDao

    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null

        fun getDatabase(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "app_database"
                ).build()
                INSTANCE = instance
                instance
            }
        }
    }
}

Назначение:

  • Центральный класс для работы с БД
  • Содержит ссылки на все DAO
  • Настраивает подключение к базе данных

Ключевые особенности:

  • @Database - аннотация для класса базы данных
  • Должен быть абстрактным и наследовать RoomDatabase
  • Версионирование (version)
  • Паттерн Singleton для доступа к экземпляру

Дополнительные компоненты

TypeConverters

class Converters {
    @TypeConverter
    fun fromTimestamp(value: Long?): Date? = value?.let { Date(it) }

    @TypeConverter
    fun dateToTimestamp(date: Date?): Long? = date?.time
}

@Database(entities = [...], version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {...}

Назначение:

  • Конвертирует сложные типы в примитивы для БД
  • Позволяет хранить Date, List и другие небазовые типы

Миграции

val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("ALTER TABLE users ADD COLUMN last_login INTEGER")
    }
}

Room.databaseBuilder(...)
    .addMigration(MIGRATION_1_2)
    .build()

Назначение:

  • Обеспечивает плавное обновление структуры БД
  • Позволяет изменять схему без потери данных

Взаимодействие компонентов

  1. Entity определяет структуру данных
  2. DAO предоставляет методы доступа к этим данным
  3. Database объединяет все сущности и DAO
  4. TypeConverters и Migrations расширяют функциональность

Резюмируем:

Room состоит из трех основных компонентов - Entity (модель данных), DAO (доступ к данным) и Database (центральная точка входа). Дополнительные возможности включают TypeConverters для работы со сложными типами и Migrations для управления версиями БД. Такая архитектура обеспечивает типобезопасность, удобство работы и высокую производительность при доступе к данным.