Sobes.tech
Junior — Middle

Ako naviazať vzťah medzi dvomi tabuľkami v databáze používajúcej Room?

sobes.tech AI

Odpoveď od AI

V Room-u je odnos između dveh tabel nastavljen s pomočjo tujih ključev in anotacij, pa tudi s pomočjo posebnih razredov za združevanje podatkov.

  1. Tuj ključ (Foreign Key) — v entiteti (Entity) označite polje z anotacijo @ForeignKey, ki se nanaša na primarni ključ druge tabele.

  2. Odnosi — za pridobivanje povezanih podatkov se ustvarijo POJO razredi z anotacijami @Relation, ki omogočajo pridobivanje vdelanih objektov iz povezanih tabel.

Primer odnosa "eden proti mnogim":

@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 // tuja ključ
)

// Razred za pridobivanje uporabnika z njegovimi knjigami
data class UserWithBooks(
    @Embedded val user: User,
    @Relation(
        parentColumn = "userId",
        entityColumn = "userOwnerId"
    )
    val books: List<Book>
)

Na ta način Room samodejno poveže tabele in omogoča pridobivanje povezanih podatkov prek DAO-ja.