Sobes.tech
Junior — Middle

Πώς να δημιουργήσετε μια σχέση μεταξύ δύο πινάκων σε μια βάση δεδομένων που χρησιμοποιεί το Room;

sobes.tech AI

Απάντηση από AI

Στο Room, η σχέση μεταξύ δύο πινάκων καθορίζεται μέσω εξωτερικών κλειδιών και σχολίων, καθώς και με ειδικές κλάσεις για τη συνένωση δεδομένων.

  1. Εξωτερικό Κλειδί (Foreign Key) — στην οντότητα (Entity), δηλώνετε ένα πεδίο με το σχόλιο @ForeignKey, που αναφέρεται στο πρωτεύον κλειδί ενός άλλου πίνακα.

  2. Σχέσεις — για την απόκτηση σχετικών δεδομένων, δημιουργούνται κλάσεις POJO με σχόλια @Relation, που επιτρέπουν την απόκτηση ενσωματωμένων αντικειμένων από σχετικούς πίνακες.

Παράδειγμα σχέσης "ένας προς πολλούς":

@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 // εξωτερικό κλειδί
)

// Κλάση για την απόκτηση του χρήστη με τα βιβλία του
data class UserWithBooks(
    @Embedded val user: User,
    @Relation(
        parentColumn = "userId",
        entityColumn = "userOwnerId"
    )
    val books: List<Book>
)

Έτσι, το Room θα συνδέσει αυτόματα τους πίνακες και θα επιτρέψει την απόκτηση σχετικών δεδομένων μέσω του DAO.