กําหนดและค้นหาความสัมพันธ์แบบ 1:หลายรายการ

ความสัมพันธ์แบบ 1: หลายรายการระหว่างเอนทิตี 2 รายการคือความสัมพันธ์ที่อินสแตนซ์แต่ละรายการของเอนทิตีหลักสอดคล้องกับอินสแตนซ์ของเอนทิตีย่อยตั้งแต่ 0 รายการขึ้นไป แต่อินสแตนซ์แต่ละรายการของเอนทิตีย่อยจะสอดคล้องกับอินสแตนซ์ของเอนทิตีหลักได้เพียง 1 รายการเท่านั้น

ในตัวอย่างแอปสตรีมมิงเพลง สมมติว่าผู้ใช้สามารถจัดระเบียบเพลงเป็นเพลย์ลิสต์ได้ ผู้ใช้แต่ละคนสามารถสร้างเพลย์ลิสต์ได้เท่าที่ต้องการ แต่จะมีเพียงผู้ใช้เพียงคนเดียวที่สร้างเพลย์ลิสต์แต่ละรายการ ดังนั้น เอนทิตี User จึงมีความสัมพันธ์แบบ 1: หลายกับเอนทิตี Playlist

ทําตามขั้นตอนต่อไปนี้เพื่อกําหนดและค้นหาความสัมพันธ์แบบ 1: หลายรายการในฐานข้อมูล

  1. กำหนดความสัมพันธ์: สร้างคลาสสำหรับเอนทิตีทั้ง 2 รายการ โดยให้เอนทิตีย่อยอ้างอิงคีย์หลักของเอนทิตีหลัก
  2. ค้นหาเอนทิตี: จำลองความสัมพันธ์ในคลาสข้อมูลใหม่ และนำเมธอดมาใช้เพื่อดึงข้อมูลที่เกี่ยวข้อง

กําหนดความสัมพันธ์

หากต้องการกำหนดความสัมพันธ์แบบ 1: หลาย ให้สร้างคลาสสำหรับเอนทิตี 2 รายการก่อน เช่นเดียวกับความสัมพันธ์แบบ 1:1 เอนทิตีย่อยต้องมีตัวแปรที่อ้างอิงคีย์หลักของเอนทิตีหลัก

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;
}

ค้นหาเอนทิตี

หากต้องการค้นหารายการผู้ใช้และเพลย์ลิสต์ที่เกี่ยวข้อง คุณต้องจำลองความสัมพันธ์แบบ 1: หลายรายการระหว่างเอนทิตี 2 รายการนี้ก่อน

โดยสร้างคลาสข้อมูลใหม่ซึ่งแต่ละอินสแตนซ์มีอินสแตนซ์ของเอนทิตีหลักและรายการอินสแตนซ์ของเอนทิตีย่อยที่เกี่ยวข้องทั้งหมด เพิ่มคำอธิบายประกอบ @Relation ลงในอินสแตนซ์ของเอนทิตีย่อย โดยตั้งค่า parentColumn เป็นชื่อคอลัมน์คีย์หลักของเอนทิตีหลัก และตั้งค่า entityColumn เป็นชื่อคอลัมน์ของเอนทิตีย่อยที่อ้างอิงคีย์หลักของเอนทิตีหลัก

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;
}

สุดท้าย ให้เพิ่มเมธอดลงในคลาส DAO ซึ่งจะแสดงผลอินสแตนซ์ทั้งหมดของคลาสข้อมูลที่จับคู่เอนทิตีหลักกับเอนทิตีย่อย วิธีนี้ต้องใช้ Room เพื่อเรียกใช้การค้นหา 2 รายการ ดังนั้นให้เพิ่มคำอธิบายประกอบ @Transaction ลงในวิธีนี้เพื่อให้การดำเนินการทั้งหมดทำงานแบบอะตอม

Kotlin

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

Java

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