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