Sobes.tech
Junior — Middle

Kaip nustatyti ryšį tarp dviejų lentelių duomenų bazėje, naudojančioje Room?

sobes.tech AI

Atsakymas iš AI

Room'e, ryšys tarp dviejų lentelių yra nustatomas naudojant užsienio raktus ir anotacijas, taip pat su specialiomis klasėmis duomenų sujungimui.

  1. Užsienio raktas (Foreign Key) — entitete (Entity) nurodote lauką su anotacija @ForeignKey, kuris nurodo į kitos lentelės pirminį raktą.

  2. Ryšiai — norint gauti susijusius duomenis, kuriamos POJO klasės su anotacijomis @Relation, leidžiančiomis gauti įterptus objektus iš susijusių lentelių.

Pavyzdys "vienas prieš daug":

@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 // užsienio raktas
)

// Klasė naudotojo ir jo knygų gavimui
data class UserWithBooks(
    @Embedded val user: User,
    @Relation(
        parentColumn = "userId",
        entityColumn = "userOwnerId"
    )
    val books: List<Book>
)

Šiuo būdu Room automatiškai sujungia lenteles ir leidžia gauti susijusius duomenis per DAO.