Bire çok ilişkiyi tanımlama ve sorgulama

İki öğe arasındaki bire çok ilişki, üst öğenin her örneğinin alt öğenin sıfır veya daha fazla örneğine karşılık geldiği ancak alt öğenin her örneğinin yalnızca üst öğenin tam olarak bir örneğine karşılık gelebileceği bir ilişkidir.

Müzik akış uygulaması örneğinde, kullanıcının şarkılarını oynatma listelerine düzenleyebileceğini varsayalım. Her kullanıcı istediği kadar çalma listesi oluşturabilir ancak her çalma listesinin tam olarak bir sahibi vardır. Bu nedenle, User öğesi ile Playlist öğesi arasında bire çok ilişki vardır.

Veritabanında bire çok ilişkileri tanımlamak ve sorgulamak için aşağıdaki adımları uygulayın:

  1. İlişkiyi tanımlayın: Her iki varlık için de sınıflar oluşturun. Alt öğe, üst öğenin birincil anahtarına referans verir.
  2. Öğeleri sorgulayın: İ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 öğe, üst öğenin 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ı sorgulayın

Kullanıcı listesini ve ilgili oynatma listelerini sorgulamak için önce iki öğe arasındaki bire çok ilişkiyi modellemelisiniz.

Bunu yapmak için her örneğin üst öğenin bir örneğini ve tüm ilgili alt öğe örneklerinin listesini barındırdığı yeni bir veri sınıfı oluşturun. @Relation ek açıklamasını alt öğe örneğine ekleyin. parentColumn, üst öğenin birincil anahtar sütununun adına, entityColumn ise alt öğenin üst öğenin birincil anahtarına referans veren sütununun adına ayarlanmalıdı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, DAO sınıfına, üst öğeyle alt öğeyi eşleyen veri sınıfının tüm örneklerini döndüren bir yöntem ekleyin. Bu yöntem, Room'un iki sorgu çalıştırmasını gerektirir. 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();