ความสัมพันธ์แบบหนึ่งต่อกลุ่มระหว่างเอนทิตี 2 รายการคือความสัมพันธ์ที่อินสแตนซ์แต่ละรายการของเอนทิตีหลักสอดคล้องกับอินสแตนซ์ของเอนทิตีย่อยตั้งแต่ 0 รายการขึ้นไป แต่ละอินสแตนซ์ของเอนทิตีย่อยจะสอดคล้องกับอินสแตนซ์ของเอนทิตีหลักได้เพียง 1 รายการเท่านั้น
ในตัวอย่างแอปสตรีมมิงเพลง สมมติว่าผู้ใช้มีความสามารถในการจัดระเบียบ
เพลงเป็นเพลย์ลิสต์ ผู้ใช้แต่ละคนสร้างเพลย์ลิสต์ได้มากเท่าที่ต้องการ
แต่จะมีผู้ใช้เพียงคนเดียวที่สร้างเพลย์ลิสต์แต่ละรายการ ดังนั้นจึงมีความสัมพันธ์แบบหนึ่งต่อหลาย
ระหว่างเอนทิตี User กับเอนทิตี Playlist
ทำตามขั้นตอนต่อไปนี้เพื่อกำหนดและค้นหาความสัมพันธ์แบบหนึ่งต่อหลายรายการในฐานข้อมูล
- กำหนดความสัมพันธ์: สร้างคลาสสำหรับทั้ง 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();