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

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

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

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

  1. กำหนดความสัมพันธ์: สร้างคลาสสำหรับทั้ง 2 เอนทิตี และ ตรวจสอบว่าคลาสหนึ่งอ้างอิงคีย์หลักของอีกคลาสหนึ่ง
  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
)