Sobes.tech
Junior — Middle

Jak navázat vztah mezi dvěma tabulkami v databázi používající Room?

sobes.tech AI

Odpověď od AI

V Room je vztah mezi dvěma tabulkami nastaven pomocí cizích klíčů a anotací, stejně jako pomocí speciálních tříd pro spojování dat.

  1. Cizí klíč (Foreign Key) — v entitě (Entity) označíte pole anotací @ForeignKey, které odkazuje na primární klíč jiné tabulky.

  2. Vztahy — pro získání souvisejících dat se vytvářejí POJO třídy s anotacemi @Relation, které umožňují získat vložené objekty z propojených tabulek.

Příklad vztahu "jeden ku mnoha":

@Entity
data class User(
    @PrimaryKey val userId: Int,
    val name: String
)

@Entity(
    foreignKeys = [ForeignKey(
        entity = User::class,
        parentColumns = ["userId"],
        childColumns = ["userOwnerId"],
        onDelete = ForeignKey.CASCADE
    )]
)
data class Book(
    @PrimaryKey val bookId: Int,
    val title: String,
    val userOwnerId: Int // cizí klíč
)

// Třída pro získání uživatele s jeho knihami
data class UserWithBooks(
    @Embedded val user: User,
    @Relation(
        parentColumn = "userId",
        entityColumn = "userOwnerId"
    )
    val books: List<Book>
)

Tímto způsobem Room automaticky propojí tabulky a umožní získat související data přes DAO.