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

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

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

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

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

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

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

Kotlin

@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
)

Java

@Entity
public class User {
    @PrimaryKey public long userId;
    public String name;
    public int age;
}

@Entity
public class Library {
    @PrimaryKey public long libraryId;
    public long userOwnerId;
}

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

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

โดยสร้างคลาสข้อมูลใหม่ที่แต่ละอินสแตนซ์มีอินสแตนซ์ของเอนทิตีหลักและอินสแตนซ์ที่เกี่ยวข้องของเอนทิตีระดับล่างสุด เพิ่มคำอธิบายประกอบ @Relation ลงในอินสแตนซ์ของเอนทิตีระดับล่างสุด โดยตั้งค่า parentColumn เป็นชื่อคอลัมน์คีย์หลักของเอนทิตีระดับบนสุด และตั้งค่า entityColumn เป็นชื่อคอลัมน์ของเอนทิตีระดับล่างสุด ที่อ้างอิงคีย์หลักของเอนทิตีระดับบนสุด

Kotlin

data class UserAndLibrary(
    @Embedded val user: User,
    @Relation(
         parentColumn = "userId",
         entityColumn = "userOwnerId"
    )
    val library: Library
)

Java

public class UserAndLibrary {
    @Embedded public User user;
    @Relation(
         parentColumn = "userId",
         entityColumn = "userOwnerId"
    )
    public Library library;
}

สุดท้าย ให้เพิ่มเมธอดลงในคลาส DAO ที่แสดงผลอินสแตนซ์ทั้งหมดของคลาสข้อมูลที่จับคู่เอนทิตีหลักกับเอนทิตีระดับล่างสุด เมธอดนี้กำหนดให้ Room เรียกใช้ 2 คำค้นหา ดังนั้นคุณควรเพิ่ม@Transaction คำอธิบายประกอบลงในเมธอดนี้ ซึ่งจะช่วยให้การดำเนินการทั้งหมดทำงานแบบอะตอมมิก

Kotlin

@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>

Java

@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();