Menentukan dan membuat kueri hubungan one-to-many

Hubungan one-to-many antara dua entity adalah hubungan saat setiap instance parent entity tidak berkaitan atau berkaitan dengan beberapa instance entity turunan, tetapi setiap instance entity turunan hanya berkaitan dengan tepat satu instance parent entity.

Dalam contoh aplikasi streaming musik, misalnya pengguna memiliki kemampuan untuk mengatur lagu mereka ke dalam playlist. Setiap pengguna dapat membuat playlist sebanyak yang diinginkan, tetapi setiap playlist dibuat oleh satu pengguna saja. Oleh karena itu, ada hubungan one-to-many antara entity User dan entity Playlist.

Ikuti langkah-langkah berikut untuk menentukan dan membuat kueri hubungan one-to-many di database Anda:

  1. Menentukan hubungan: Buat class untuk kedua entity, dengan entity turunan mereferensikan kunci utama induk.
  2. Buat kueri entitas: Buat model hubungan dalam class data baru dan terapkan metode untuk mengambil data terkait.

Menentukan hubungan

Untuk menentukan hubungan one-to-many, buat class untuk dua entity terlebih dahulu. Seperti dalam hubungan one-to-one, entity turunan harus menyertakan variabel yang merupakan referensi ke kunci utama parent entity.

Kotlin

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

@Entity
data class Playlist(
    @PrimaryKey val playlistId: Long,
    val userCreatorId: Long,
    val playlistName: String
)

Java

@Entity
public class User {
    @PrimaryKey public long userId;
    public String name;
    public int age;
}

@Entity
public class Playlist {
    @PrimaryKey public long playlistId;
    public long userCreatorId;
    public String playlistName;
}

Membuat kueri entitas

Untuk membuat kueri daftar pengguna dan playlist terkait, Anda harus terlebih dahulu membuat model hubungan one-to-many antara dua entity

Untuk melakukannya, buat class data baru tempat setiap instance memiliki instance entity induk dan daftar semua instance entity turunan yang sesuai. Tambahkan anotasi @Relation ke instance entity turunan, dengan parentColumn ditetapkan ke nama kolom kunci utama dari entity induk dan entityColumn ditetapkan ke nama kolom entity turunan yang mereferensikan kunci utama entity induk.

Kotlin

data class UserWithPlaylists(
    @Embedded val user: User,
    @Relation(
          parentColumn = "userId",
          entityColumn = "userCreatorId"
    )
    val playlists: List<Playlist>
)

Java

public class UserWithPlaylists {
    @Embedded public User user;
    @Relation(
         parentColumn = "userId",
         entityColumn = "userCreatorId"
    )
    public List<Playlist> playlists;
}

Terakhir, tambahkan metode ke class DAO yang menampilkan semua instance class data yang menghubungkan parent entity dan entity turunan. Metode ini memerlukan Room untuk menjalankan dua kueri, jadi tambahkan anotasi @Transaction ke metode ini sehingga seluruh operasi dijalankan secara atomik.

Kotlin

@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>

Java

@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();