Menentukan dan membuat kueri hubungan one-to-one

Hubungan one-to-one antara dua entity adalah hubungan saat setiap instance parent entity berkaitan dengan tepat satu instance entity turunan, dan hal sebaliknya juga berlaku.

Misalnya, pertimbangkan aplikasi streaming musik tempat pengguna memiliki library lagu yang mereka miliki. Setiap pengguna hanya memiliki satu library, dan setiap library berkaitan dengan tepat satu pengguna. Oleh karena itu, ada hubungan one-to-one antara entity User dan entity Library.

Ikuti langkah-langkah berikut untuk menentukan dan mengkueri hubungan one-to-one di database Anda:

  1. Menentukan hubungan: Buat class untuk kedua entity, dan pastikan salah satunya mereferensikan kunci utama entity lainnya.
  2. Mengkueri entity: Modelkan hubungan dalam class data baru, dan buat fungsi untuk mengambil data terkait.

Menentukan hubungan

Untuk menentukan hubungan one-to-one, pertama-tama buat class untuk kedua entity Anda. Salah satu entity harus menyertakan variabel yang mereferensikan kunci utama entity lainnya.

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

@Entity
data class Library(
    @PrimaryKey val libraryId: Long,
    val userOwnerId: Long
)

Mengkueri entity

Untuk mengkueri daftar pengguna dan library terkait, Anda harus terlebih dahulu memodelkan hubungan one-to-one antara dua entity.

Untuk memodelkan hubungan, buat class data baru di mana setiap instance menyimpan instance parent entity dan entity turunan yang sesuai. Tambahkan anotasi ke entity turunan.@Relation Tetapkan parentColumns ke nama kolom kunci utama parent entity, dan tetapkan entityColumns ke nama kolom entity turunan yang mereferensikan kunci utama parent.

data class UserAndLibrary(
    @Embedded val user: User,
    @Relation(
        parentColumns = ["userId"],
        entityColumns = ["userOwnerId"]
    )
    val library: Library
)

Terakhir, tambahkan fungsi ke class objek akses data (DAO) yang menampilkan semua instance class data yang menghubungkan parent entity dengan entity turunan. Tambahkan anotasi @Transaction untuk memastikan Room melakukan seluruh operasi secara atomik, karena fungsi ini mengharuskan Room menjalankan dua kueri.

@Transaction
@Query("SELECT * FROM User")
suspend fun getUsersAndLibraries(): List<UserAndLibrary>

Kunci komposit

Jika Anda menentukan hubungan menggunakan kunci komposit, tentukan beberapa kolom di parentColumns dan entityColumns. Urutan kolom di parentColumns harus cocok dengan urutan kolom di entityColumns.

@Entity(primaryKeys = ["firstName", "lastName"])
data class User(
    val firstName: String,
    val lastName: String,
    val age: Int
)

@Entity
data class Library(
    @PrimaryKey val libraryId: Long,
    val userFirstName: String,
    val userLastName: String
)

data class UserAndLibrary(
    @Embedded val user: User,
    @Relation(
        parentColumns = ["firstName", "lastName"],
        entityColumns = ["userFirstName", "userLastName"]
    )
    val library: Library
)