兩個實體之間的「一對一關係」是指父系實體的每個例項都明確對應一個子實體的例項,反之亦然。
舉例來說,假設有一個音樂串流應用程式,使用者在其中擁有自己的媒體庫。每位使用者只有一個媒體庫,且每個媒體庫明確對應一位使用者。因此,User 實體和 Library 實體之間是一對一關係。
請按照下列步驟,在資料庫中定義及查詢一對一關係:
定義關係
如要定義一對一關係,請先為兩個實體建立類別。其中一個實體必須包含參照另一個實體主鍵的變數。
@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 )
查詢實體
如要查詢使用者和對應媒體庫的清單,您必須先建立兩個實體之間的一對一關係模型。
如要建立關係模型,請建立新的資料類別,該類別的每個執行個體都含有上層實體執行個體,以及對應的子實體執行個體。在子實體中加入 @Relation 註解。將 parentColumns 設為父系實體主鍵資料欄的名稱,然後將 entityColumns 設為參照父系主鍵的子實體資料欄名稱。
data class UserAndLibrary( @Embedded val user: User, @Relation( parentColumns = ["userId"], entityColumns = ["userOwnerId"] ) val library: Library )
最後,在資料存取物件 (DAO) 類別中新增函式,以傳回將上層實體與子項實體配對的資料類別所有例項。加入 @Transaction 註解,確保 Room 以不可分割的形式執行整個作業,因為這個函式會要求 Room 執行兩項查詢。
@Transaction @Query("SELECT * FROM User") suspend fun getUsersAndLibraries(): List<UserAndLibrary>
複合鍵
如果使用複合鍵定義關係,請在 parentColumns 和 entityColumns 中指定多個資料欄。parentColumns 中的資料欄順序必須與 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 )