Что такое @PrimaryKey, @Ignore, @Embedded, @TypeConverters в Room?android-20

В Room Persistence Library используются различные аннотации для определения структуры базы данных и поведения сущностей. Разберем ключевые аннотации:

1. @PrimaryKey - Уникальный идентификатор

@Entity
data class User(
    @PrimaryKey val id: Long,
    val name: String
)
  • Назначение: Помечает поле как первичный ключ таблицы
  • Особенности:
    • Обязателен для каждой Entity
    • Можно использовать autoGenerate = true для автоинкремента
    • Для составного ключа: @PrimaryKey(autoGenerate = false)

2. @Ignore - Исключение поля из БД

@Entity
data class User(
    @PrimaryKey val id: Long,
    val name: String,
    @Ignore val temporaryToken: String
)
  • Назначение: Поле не будет сохранено в базе данных
  • Варианты использования:
    • Временные или вычисляемые поля
    • Поля, которые не нужно сохранять между сеансами
    • Можно аннотировать весь конструктор: @Ignore constructor()

3. @Embedded - Вложение объекта

data class Address(
    val street: String,
    val city: String
)

@Entity
data class User(
    @PrimaryKey val id: Long,
    val name: String,
    @Embedded val address: Address
)
  • Назначение: Позволяет "развернуть" поля объекта в таблице
  • Преимущества:
    • Упрощает организацию данных
    • Избегает создания отдельной таблицы
    • Можно использовать префиксы: @Embedded(prefix = "home_")

4. @TypeConverters - Кастомные преобразователи

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

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

@Entity
@TypeConverters(DateConverter::class)
data class Event(
    @PrimaryKey val id: Long,
    val name: String,
    val date: Date // Кастомный тип
)
  • Назначение: Для сохранения неподдерживаемых типов (Date, Enum, коллекции)
  • Где можно применять:
    • На уровне класса (только для этой Entity)
    • На уровне DAO (для методов DAO)
    • На уровне Database (глобально для всей БД)

Комбинированный пример

@Entity
@TypeConverters(DateConverter::class)
data class User(
    @PrimaryKey(autoGenerate = true) val id: Long = 0,
    val name: String,
    @Embedded val address: Address,
    @Ignore val sessionToken: String,
    val registrationDate: Date
)

Резюмируем:

Room предоставляет мощные аннотации для гибкого управления структурой базы данных. @PrimaryKey определяет уникальный идентификатор, @Ignore исключает поля из хранения, @Embedded позволяет вкладывать объекты, а @TypeConverters дает возможность работать с кастомными типами данных.