ความสัมพันธ์แบบหนึ่งต่อหนึ่งระหว่าง 2 เอนทิตีคือความสัมพันธ์ที่อินสแตนซ์แต่ละรายการของเอนทิตีหลักสอดคล้องกับอินสแตนซ์ของเอนทิตีระดับล่างสุดเพียงรายการเดียวเท่านั้น และในทางกลับกันก็เป็นจริงด้วย
ตัวอย่างเช่น ลองนึกถึงแอปสตรีมมิงเพลงที่ผู้ใช้มีคลังเพลงของตนเอง ผู้ใช้แต่ละรายมีคลังเพลงเพียงคลังเดียว และคลังเพลงแต่ละคลังสอดคล้องกับผู้ใช้เพียงรายเดียวเท่านั้น ดังนั้นจึงมีความสัมพันธ์แบบหนึ่งต่อหนึ่งระหว่างเอนทิตี User กับเอนทิตี Library
ทำตามขั้นตอนต่อไปนี้เพื่อกำหนดและค้นหาความสัมพันธ์แบบหนึ่งต่อหนึ่งในฐานข้อมูล
- กำหนดความสัมพันธ์: สร้างคลาสสำหรับทั้ง 2 เอนทิตี และ ตรวจสอบว่าคลาสหนึ่งอ้างอิงคีย์หลักของอีกคลาสหนึ่ง
- ค้นหาเอนทิตี: สร้างโมเดลความสัมพันธ์ในคลาสข้อมูลใหม่ และสร้างฟังก์ชันเพื่อดึงข้อมูลที่เกี่ยวข้อง
กำหนดความสัมพันธ์
หากต้องการกำหนดความสัมพันธ์แบบหนึ่งต่อหนึ่ง ให้สร้างคลาสสำหรับเอนทิตีทั้ง 2 ก่อน โดยเอนทิตีหนึ่งต้องมีตัวแปรที่อ้างอิงคีย์หลักของอีกเอนทิตีหนึ่ง
@Entity data class User( @PrimaryKey val userId: Long, val name: String, val age: Int ) @Entity data class Library( @PrimaryKey val libraryId: Long, val userOwnerId: Long )
ค้นหาเอนทิตี
หากต้องการค้นหารายการผู้ใช้และคลังเพลงที่เกี่ยวข้อง คุณต้องสร้างโมเดลความสัมพันธ์แบบหนึ่งต่อหนึ่งระหว่าง 2 เอนทิตีก่อน
หากต้องการสร้างโมเดลความสัมพันธ์ ให้สร้างคลาสข้อมูลใหม่ที่แต่ละอินสแตนซ์มีอินสแตนซ์ของเอนทิตีระดับบนสุดและเอนทิตีระดับล่างสุดที่เกี่ยวข้อง เพิ่มคำอธิบายประกอบ
@Relation ลงในเอนทิตีระดับล่างสุด ตั้งค่า parentColumns เป็น
ชื่อคอลัมน์คีย์หลักของเอนทิตีระดับบนสุด และตั้งค่า
entityColumns เป็นชื่อคอลัมน์ของเอนทิตีระดับล่างสุดที่อ้างอิง
คีย์หลักของเอนทิตีระดับบนสุด
data class UserAndLibrary( @Embedded val user: User, @Relation( parentColumns = ["userId"], entityColumns = ["userOwnerId"] ) val library: Library )
สุดท้าย ให้เพิ่มฟังก์ชันลงในคลาสออบเจ็กต์การเข้าถึงข้อมูล (DAO) ที่แสดงผลอินสแตนซ์ทั้งหมดของคลาสข้อมูลที่จับคู่เอนทิตีระดับบนสุดกับเอนทิตีระดับล่างสุด เพิ่มคำอธิบายประกอบ @Transaction เพื่อให้ Room ดำเนินการทั้งหมดแบบอะตอมมิก เนื่องจากฟังก์ชันนี้กำหนดให้ Room เรียกใช้การค้นหา 2 รายการ
@Transaction @Query("SELECT * FROM User") suspend fun getUsersAndLibraries(): List<UserAndLibrary>
คีย์ผสม
หากกำหนดความสัมพันธ์โดยใช้คีย์ผสม ให้ระบุหลายคอลัมน์ใน parentColumns และ entityColumns ลำดับคอลัมน์ใน parentColumns ต้องตรงกับลำดับคอลัมน์ใน entityColumns
@Entity(primaryKeys = ["firstName", "lastName"]) data class User( val firstName: String, val lastName: String, val age: Int ) @Entity data class Library( @PrimaryKey val libraryId: Long, val userFirstName: String, val userLastName: String ) data class UserAndLibrary( @Embedded val user: User, @Relation( parentColumns = ["firstName", "lastName"], entityColumns = ["userFirstName", "userLastName"] ) val library: Library )