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

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

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

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

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

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

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

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;
}

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

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

Kotlin

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

Java

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