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

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

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

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

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

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

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

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

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

หากต้องการค้นหารายชื่อผู้ใช้และเพลย์ลิสต์ที่เกี่ยวข้อง คุณต้องสร้างรูปแบบ ความสัมพันธ์แบบหนึ่งต่อหลายระหว่างเอนทิตีทั้ง 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();