두 항목 간의 일대다 관계는 상위 항목의 각 인스턴스가 0개 이상의 하위 항목 인스턴스에 상응하지만 하위 항목의 각 인스턴스는 정확히 하나의 상위 항목 인스턴스에만 상응할 수 있는 관계입니다.
음악 스트리밍 앱의 예에서 사용자가 노래를 재생목록으로 구성할 수 있다고 가정해 보겠습니다. 각 사용자는 원하는 수만큼 재생목록을 만들 수 있지만 각 재생목록을 만든 사용자는 단 한 명입니다. 따라서 User
항목과 Playlist
항목은 일대다 관계입니다.
데이터베이스에서 일대다 관계를 정의하고 쿼리하려면 다음 단계를 따르세요.
- 관계 정의: 하위 항목이 상위 항목의 기본 키를 참조하도록 두 항목의 클래스를 만듭니다.
- 항목 쿼리: 새 데이터 클래스에서 관계를 모델링하고 관련 데이터를 가져오는 메서드를 구현합니다.
관계 정의
일대다 관계를 정의하려면 먼저 두 항목의 클래스를 만듭니다. 일대일 관계에서와 같이 하위 항목은 상위 항목의 기본 키 참조인 변수를 포함해야 합니다.
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
)
자바
@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;
}
항목 쿼리
사용자 목록 및 상응하는 재생목록을 쿼리하려면 먼저 두 항목 간의 일대다 관계를 모델링해야 합니다.
이렇게 하려면 각 인스턴스가 상위 항목 인스턴스 및 상응하는 모든 하위 항목 인스턴스 목록을 보유하는 새 데이터 클래스를 만듭니다. parentColumn
을 상위 항목의 기본 키 열 이름으로 설정하고 entityColumn
을 상위 항목의 기본 키를 참조하는 하위 항목의 열 이름으로 설정하여 @Relation
주석을 하위 항목 인스턴스에 추가합니다.
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에서 쿼리 2개를 실행해야 하므로 전체 작업이 각각 실행되도록 이 메서드에 @Transaction
주석을 추가해야 합니다.
Kotlin
@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();