Что такое аннотация Embedded в Room

Ответ

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

Пример:

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

@Entity
data class User(
    @PrimaryKey val id: Int,
    val name: String,
    @Embedded val address: Address
)

В таблице User будут колонки: id, name, street, city. Можно использовать prefix для избежания конфликтов имен. Подходит для композиции объектов, но не для наследования.

Ответ 18+ 🔞

А, ну это же про тот самый Room, который иногда так мозги выносит, что хочется головой об стенку биться. Смотри, есть у них такая фишка — @Embedded. Представь, что ты не хочешь заморачиваться с отдельной таблицей для какого-то мелкого объекта, типа адреса. Ну правда, зачем ему целая таблица, если он всегда идёт в комплекте с пользователем? Как носки, только не теряется.

Так вот, эта аннотация — просто магия, ёпта. Берёшь свой класс, вкладываешь его в сущность, и Room разворачивает его поля прямо в колонки основной таблицы. Никаких лишних связей, джойнов, геморроя. Красота!

Вот смотри на пример, тут всё понятно как божий день:

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

@Entity
data class User(
    @PrimaryKey val id: Int,
    val name: String,
    @Embedded val address: Address
)

Что в итоге? В таблице User будут колонки: id, name, street, city. Всё! Объект Address как будто растворился, но его поля на месте. Удобно, правда?

А ещё, если ты вкладываешь несколько объектов с одинаковыми именами полей (ну, бывает же, два адреса: домашний и рабочий), то тут тебе на помощь приходит prefix. Накинешь префикс "home" или "work" — и конфликтов как не бывало. Хитрая жопа, но работает.

Главное помнить — штука эта для композиции, когда один объект является частью другого. Для наследования она не подходит, тут уж извини. Не пытайся запихнуть сюда сложную иерархию классов, а то получишь пиздопроебибну с ошибками компиляции. Используй по назначению, и будет тебе счастье. Всё гениальное — просто, иногда даже в Android-разработке.