定義及查詢一對多關係

兩個實體之間的「一對多關係」是指父系實體的每個例項分別對應到子實體的零個或更多例項,但子實體的每個例項只能確切對應到一個父系實體的例項。

在音樂串流應用程式範例中,假設使用者能夠將歌曲整理成多個播放清單。每位使用者可以建立任意數量的播放清單,但每個播放清單僅由一位使用者建立。因此,User 實體和 Playlist 實體之間是一對多關係。

如要定義及查詢資料庫中的一對多關係,請按照下列步驟操作:

  1. 定義關係:為兩個實體建立類別,其中子實體會參照父項的主鍵。
  2. 查詢實體:在新資料類別中建立關係模型,並實作方法來擷取相關資料。

定義關係

如要定義一對多關係,請先為兩個實體建立類別。與一對一關係相同,子實體必須包含一個參照父系實體主鍵的變數。

Kotlin

@Entity
data class User(
    @PrimaryKey val userId: Long,
    val name: String,
    val age: Int
)

@Entity
data class Playlist(
    @PrimaryKey val playlistId: Long,
    val userCreatorId: Long,
    val playlistName: String
)

Java

@Entity
public class User {
    @PrimaryKey public long userId;
    public String name;
    public int age;
}

@Entity
public class Playlist {
    @PrimaryKey public long playlistId;
    public long userCreatorId;
    public String playlistName;
}

查詢實體

如要查詢使用者和對應播放清單的清單,您必須先建立兩個實體之間的一對多關係模型

如要這麼做,請建立新的資料類別,讓該類別的每個例項都含有父系實體的例項,以及所有對應子實體例項的清單。在子實體的例項中加入 @Relation 註解,將 parentColumn 設為父系實體主鍵欄的名稱,然後再將 entityColumn 設為參照父系實體主鍵的子實體資料欄名稱。

Kotlin

data class UserWithPlaylists(
    @Embedded val user: User,
    @Relation(
          parentColumn = "userId",
          entityColumn = "userCreatorId"
    )
    val playlists: List<Playlist>
)

Java

public class UserWithPlaylists {
    @Embedded public User user;
    @Relation(
         parentColumn = "userId",
         entityColumn = "userCreatorId"
    )
    public List<Playlist> playlists;
}

最後,在 DAO 類別中新增方法,以傳回將父系實體和子實體配對的資料類別所有例項。此方法會要求 Room 執行兩項查詢,因此請在此方法中加入 @Transaction 註解,讓整個作業以不可中斷的方式執行。

Kotlin

@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>

Java

@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();