Как связать две таблицы в Room

«Как связать две таблицы в Room» — вопрос из категории Базы данных, который задают на 24% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Room для связи таблиц используйте аннотации @Relation, @ForeignKey или создание промежуточной таблицы для many-to-many связи.

1:1 или 1:many (с ForeignKey):

@Entity(foreignKeys = [ForeignKey(
    entity = User::class,
    parentColumns = ["id"],
    childColumns = ["userId"],
    onDelete = CASCADE
)])
data class Order(
    @PrimaryKey val id: Long,
    val userId: Long
)

data class UserWithOrders(
    @Embedded val user: User,
    @Relation(
        parentColumn = "id",
        entityColumn = "userId"
    )
    val orders: List<Order>
)

Many-to-many (через junction таблицу):

@Entity
data class Playlist(
    @PrimaryKey val id: Long
)

@Entity
data class Song(
    @PrimaryKey val id: Long
)

@Entity(primaryKeys = ["playlistId", "songId"])
data class PlaylistSongCrossRef(
    val playlistId: Long,
    val songId: Long
)