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