Bire bir ilişkileri tanımlama ve sorgulama

İki öğe arasındaki bire bir ilişki, üst öğenin her örneğinin alt öğenin tam olarak bir örneğine karşılık geldiği ve bunun tersi de geçerli olan bir ilişkidir.

Örneğin, kullanıcının sahip olduğu bir şarkı kitaplığının bulunduğu bir müzik yayını uygulamasını düşünün. Her kullanıcının yalnızca bir kitaplığı vardır ve her kitaplık tam olarak bir kullanıcıya karşılık gelir. Bu nedenle, User öğesi ile Library öğesi arasında bire bir ilişki vardır.

Veritabanınıza bire bir 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 ve bir sınıfın diğerinin birincil anahtarına referans vermesini sağlayın.
  2. Öğeleri sorgulayın: İlişkiyi yeni bir veri sınıfında modelleyin ve ilgili verileri almak için bir yöntem oluşturun.

İlişkiyi tanımlama

Bire bir ilişki tanımlamak için önce iki öğenizin her biri için bir sınıf oluşturun. Tüzel kişilerden biri, diğer tüzel kişinin 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 Library(
    @PrimaryKey val libraryId: Long,
    val userOwnerId: Long
)

Java

@Entity
public class User {
    @PrimaryKey public long userId;
    public String name;
    public int age;
}

@Entity
public class Library {
    @PrimaryKey public long libraryId;
    public long userOwnerId;
}

Varlıkları sorgulayın

Kullanıcıların listesini ve ilgili kitaplıkları sorgulamak için öncelikle iki öğe arasındaki bire bir ilişkiyi modellemeniz gerekir.

Bunu yapmak için her örneğin üst öğenin bir örneğini ve alt öğenin ilgili örneğini 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 UserAndLibrary(
    @Embedded val user: User,
    @Relation(
         parentColumn = "userId",
         entityColumn = "userOwnerId"
    )
    val library: Library
)

Java

public class UserAndLibrary {
    @Embedded public User user;
    @Relation(
         parentColumn = "userId",
         entityColumn = "userOwnerId"
    )
    public Library library;
}

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 için Room'un iki sorgu çalıştırması gerekir. Bu nedenle, bu yönteme @Transaction notunu eklemeniz gerekir. Bu, işlemin tamamının atomik olarak yürütülmesini sağlar.

Kotlin

@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>

Java

@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();