두 항목 간의 일대다 관계 는 상위 항목의 각 인스턴스가 0개 이상의 하위 항목 인스턴스에 상응하지만 하위 항목의 각 인스턴스는 정확히 하나의 상위 항목 인스턴스에만 상응할 수 있는 관계입니다.
음악 스트리밍 앱의 예에서 사용자가 노래를 재생목록으로 구성할 수 있다고 가정해 보겠습니다. 각 사용자는 원하는 수만큼 재생목록을 만들 수 있지만 각 재생목록을 만든 사용자는 단 한 명입니다. 따라서 User 항목과 Playlist 항목 간에는 일대다 관계가 있습니다.
다음 단계에 따라 데이터베이스에서 일대다 관계를 정의하고 쿼리합니다.
- 관계 정의: 두 항목의 클래스를 만들고 하위 항목이 상위 항목의 기본 키를 참조하도록 합니다.
- 항목 쿼리: 새 데이터 클래스에서 관계를 모델링하고 관련 데이터를 가져오는 함수를 구현합니다.
관계 정의
일대다 관계를 정의하려면 먼저 각 항목의 클래스를 만듭니다. 일대일 관계에서와 같이 하위 항목은 상위 항목의 기본 키를 참조하는 변수를 포함해야 합니다.
@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 )
항목 쿼리
사용자 목록 및 상응하는 재생목록을 쿼리하려면 먼저, 두 항목 간의 일대다 관계를 모델링해야 합니다.
관계를 모델링하려면 새 데이터 클래스를 만듭니다. 이 클래스의 각 인스턴스는 상위 항목 인스턴스 및 상응하는 모든 하위 항목 인스턴스 목록을 보유합니다.
하위 항목 목록
을 나타내는 속성에 @Relation 주석을 추가합니다. parentColumns를 상위 항목의
기본 키 열 이름으로 설정하고 entityColumns를 상위 항목의 기본 키를 참조하는 하위
항목의 열 이름으로 설정합니다.
data class UserWithPlaylists( @Embedded val user: User, @Relation( parentColumns = ["userId"], entityColumns = ["userCreatorId"] ) val playlists: List<Playlist> )
마지막으로 상위 항목과 하위 항목을 쌍으로 하는 데이터 클래스의 모든 인스턴스를 반환하는 함수를 데이터 액세스 객체 (DAO) 클래스에 추가합니다.
Room에서 전체 작업을
원자적으로 실행하도록 @Transaction 주석을 추가합니다. 이 함수를 사용하려면 Room에서 쿼리 2개를 실행해야 하므로 이 주석이 필요합니다.
@Transaction @Query("SELECT * FROM User") suspend fun getUsersWithPlaylists(): List<UserWithPlaylists>
복합 키
복합 키를 사용하여 관계를 정의하는 경우 parentColumns 및 entityColumns에 여러 열을 지정합니다. parentColumns의 열 순서는 entityColumns의 열 순서와 일치해야 합니다.
@Entity(primaryKeys = ["firstName", "lastName"]) data class User( val firstName: String, val lastName: String, val age: Int ) @Entity data class Playlist( @PrimaryKey val playlistId: Long, val userFirstName: String, val userLastName: String, val playlistName: String ) data class UserWithPlaylists( @Embedded val user: User, @Relation( parentColumns = ["firstName", "lastName"], entityColumns = ["userFirstName", "userLastName"] ) val playlists: List<Playlist> )