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