İki varlık arasındaki bire çok ilişki, ana varlığın her örneğinin alt varlığın sıfır veya daha fazla örneğine karşılık geldiği ancak alt varlığın her örneğinin yalnızca ana varlığın tek bir örneğine karşılık gelebildiği bir ilişkidir.
Müzik akışı uygulaması örneğinde, kullanıcının şarkılarını oynatma listelerinde düzenleyebildiğini varsayalım. Her kullanıcı istediği kadar oynatma listesi oluşturabilir ancak her oynatma listesini yalnızca bir kullanıcı oluşturur. Bu nedenle, User varlığı ile Playlist varlığı arasında bire çok ilişki vardır.
Veritabanınızdaki bire çok ilişkileri tanımlamak ve sorgulamak için aşağıdaki adımları uygulayın:
- İlişkiyi tanımlayın: Her iki öğe için de sınıflar oluşturun. Alt öğe, üst öğenin birincil anahtarına referans vermelidir.
- Varlıkları sorgulama: İlişkiyi yeni bir veri sınıfında modelleyin ve ilgili verileri almak için bir yöntem uygulayın.
İlişkiyi tanımlama
Bire çok ilişki tanımlamak için önce iki öğe için bir sınıf oluşturun. Bire bir ilişkide olduğu gibi, alt varlık, ana varlığın birincil anahtarına referans veren bir değişken içermelidir.
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;
}
Varlıkları sorgulama
Kullanıcı listesini ve ilgili oynatma listelerini sorgulamak için öncelikle iki öğe arasındaki bire çok ilişkiyi modellemeniz gerekir.
Bunu yapmak için her örneğin ana varlık örneğini ve karşılık gelen tüm alt öğe varlık örneklerinin listesini tuttuğu yeni bir veri sınıfı oluşturun. @Relation ek açıklamasını alt öğe örneğine ekleyin. Burada parentColumn, üst öğenin birincil anahtar sütununun adı, entityColumn ise üst öğenin birincil anahtarına referans veren alt öğe sütununun adı olarak ayarlanır.
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;
}
Son olarak, ana varlık ile alt öğeyi eşleştiren veri sınıfının tüm örneklerini döndüren bir yöntem ekleyin. Bu yöntemin iki sorgu çalıştırması için Room gerekir. Bu nedenle, tüm işlemin atomik olarak gerçekleştirilmesi için bu yönteme @Transaction ek açıklamasını ekleyin.
Kotlin
@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();