兩個實體之間的「一對一關係」是指父系實體的每個例項都明確對應一個子實體的例項,反之亦然。
舉例來說,假設有一個音樂串流應用程式,使用者在其中擁有自己的媒體庫。每位使用者只有一個媒體庫,且每個媒體庫明確對應一位使用者。因此,User
實體和 Library
實體之間是一對一的關係。
請按照下列步驟,在資料庫中定義及查詢一對一關係:
定義關係
如要定義一對一關係,請先為兩個實體建立類別。其中一個實體必須包含參照另一個實體主鍵的變數。
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;
}
查詢實體
如要查詢使用者和對應媒體庫的清單,您必須先建立兩個實體之間的一對一關係模型。
如要這麼做,請建立新的資料類別,該類別的每個例項都含有父系實體例項,以及對應的子實體例項。在子實體的例項中加入 @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 執行兩項查詢。因此,您應將 @Transaction
註解新增至這個方法。這可確保整個作業以原子方式執行。
Kotlin
@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();