İ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 tam olarak 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 listeleri halinde 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ızda bire çok ilişkileri tanımlamak ve sorgulamak için aşağıdaki adımları uygulayın:
- İlişkiyi tanımlayın: Her iki varlık için de sınıflar oluşturun. Alt varlık, ü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 işlev uygulayın.
İlişkiyi tanımlama
Bire çok ilişki tanımlamak için önce her varlık 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.
@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 )
Varlıkları sorgulama
Kullanıcı listesini ve ilgili oynatma listelerini sorgulamak için öncelikle iki öğe arasındaki bire çok ilişkiyi modellemeniz gerekir.
İlişkiyi modellemek için yeni bir veri sınıfı oluşturun. Bu sınıfın her örneği, ana varlık örneğini ve karşılık gelen tüm alt varlık örneklerinin listesini içerir.
Alt öğe listesini temsil eden özelliğe @Relation açıklamasını ekleyin. parentColumns değerini üst öğe varlığının birincil anahtar sütununun adı olarak, entityColumns değerini ise üst öğe varlığının birincil anahtarına referans veren alt öğe varlığının sütununun adı olarak ayarlayın.
data class UserWithPlaylists( @Embedded val user: User, @Relation( parentColumns = ["userId"], entityColumns = ["userCreatorId"] ) val playlists: List<Playlist> )
Son olarak, ana varlık ile alt öğeyi eşleştiren veri sınıfının tüm örneklerini döndüren bir işlevi veri erişimi nesnesi (DAO) sınıfına ekleyin.
Room'un tüm işlemi atomik olarak gerçekleştirmesi için @Transaction ek açıklamasını ekleyin. İşlevin iki sorgu çalıştırmak için Room'a ihtiyacı olduğundan bu ek açıklama gereklidir.
@Transaction @Query("SELECT * FROM User") suspend fun getUsersWithPlaylists(): List<UserWithPlaylists>
Bileşik anahtarlar
İlişkiyi bileşik anahtarlar kullanarak tanımlarsanız parentColumns ve entityColumns içinde birden fazla sütun belirtin. parentColumns içindeki sütunların sırası, entityColumns içindeki sütunların sırasıyla eşleşmelidir.
@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> )