Xác định và truy vấn mối quan hệ một với một

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ột 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 với một trong cơ sở dữ liệu:

  1. Xác định mối quan hệ: Tạo lớp cho cả hai thực thể, đảm bảo một thực thể tham chiếu đến khoá chính của thực thể kia.
  2. 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 phương thức để truy xuất dữ liệu 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 bao gồm một biến là tham chiếu đến khoá chính của thực thể kia.

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

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ể.

Để thực hiện việc 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à một bản sao tương ứng của thực thể con. Thêm chú thích @Relation vào bản sao của thực thể con, trong đó parentColumn được đặt làm tên cho cột khoá chính của thực thể mẹ và entityColumn được đặt làm tên cho cột của thực thể con tham chiếu đến khoá chính của thực thể mẹ.

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

Cuối cùng, một phương thức được thêm vào lớp DAO sẽ trả về tất cả các bản sao của lớp dữ liệu mà ghép nối thực thể mẹ và thực thể con. Phương thức này đòi hỏi Room chạy hai truy vấn. Do đó, bạn nên thêm chú thích @Transaction vào phương thức này. Điều này đảm bảo rằng toàn bộ thao tác sẽ chạy một cách nguyên tử.

Kotlin

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

Java

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