Mối quan hệ một với một giữa hai thực thể là mối quan hệ trong đó mỗi bản sao của thực thể mẹ tương ứng với đúng một bản sao của thực thể con và ngược lại.
Ví dụ: xem xét một ứng dụng phát nhạc trực tuyến trong đó người dùng có thư viện bài hát mà họ sở hữu. Mỗi người dùng chỉ có một thư viện và mỗi thư viện tương ứng với đúng một người dùng. Do đó, có mối quan hệ một với một giữa thực thể User và thực thể Library.
Hãy làm theo các bước sau để xác định và truy vấn mối quan hệ một-một trong cơ sở dữ liệu của bạn:
- Xác định mối quan hệ: Tạo các lớp cho cả hai thực thể và đảm bảo rằng một thực thể tham chiếu đến khoá chính của thực thể kia.
- Truy vấn các thực thể: Mô hình hoá mối quan hệ trong một lớp dữ liệu mới và tạo một hàm để truy xuất dữ liệu có liên quan.
Xác định mối quan hệ
Để xác định mối quan hệ một với một, trước tiên, tạo một lớp cho mỗi thực thể. Một trong các thực thể phải có một biến tham chiếu đến khoá chính của thực thể kia.
@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 )
Truy vấn các thực thể
Để truy vấn danh sách người dùng và thư viện tương ứng, trước tiên, bạn phải mô hình hoá mối quan hệ một với một giữa 2 thực thể.
Để mô hình hoá mối quan hệ này, hãy tạo một lớp dữ liệu mới, trong đó mỗi bản sao sẽ chứa một bản sao của thực thể mẹ và thực thể con tương ứng. Thêm chú thích @Relation vào thực thể con. Đặt parentColumns thành tên của cột khoá chính của thực thể mẹ và đặt entityColumns thành tên của cột của thực thể con tham chiếu đến khoá chính của thực thể mẹ.
data class UserAndLibrary( @Embedded val user: User, @Relation( parentColumns = ["userId"], entityColumns = ["userOwnerId"] ) val library: Library )
Cuối cùng, hãy thêm một hàm vào lớp đối tượng truy cập dữ liệu (DAO) để trả về tất cả các thực thể của lớp dữ liệu có vai trò ghép nối thực thể mẹ với thực thể con. Thêm chú giải @Transaction để đảm bảo Room thực hiện toàn bộ thao tác một cách tỉ mỉ, vì hàm này đòi hỏi Room chạy hai truy vấn.
@Transaction @Query("SELECT * FROM User") suspend fun getUsersAndLibraries(): List<UserAndLibrary>
Khoá kết hợp
Nếu bạn xác định mối quan hệ bằng khoá kết hợp, hãy chỉ định nhiều cột trong parentColumns và entityColumns. Thứ tự của các cột trong parentColumns phải khớp với thứ tự của các cột trong 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 )