Bire bir ilişkileri tanımlama ve sorgulama

İki varlık arasındaki bire bir ilişki, ana varlığın her örneğinin tam olarak bir alt varlık örneğine karşılık geldiği ve bunun tersinin de geçerli olduğu bir ilişkidir.

Örneğin, kullanıcının sahip olduğu şarkılardan oluşan bir kitaplığın bulunduğu bir müzik yayın uygulamasını ele alalım. 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 varlığı ile Library varlığı arasında bire bir ilişki vardır.

Veritabanınızdaki 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 öğe için de sınıflar oluşturun. Bir sınıfın diğerinin birincil anahtarını referans aldığından emin olun.
  2. Varlıkları sorgulama: İ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 varlığınızın 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ı sorgulama

Kullanıcı 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 ana varlık örneğini ve karşılık gelen alt öğe örneğini 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 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, 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öntem için Room'un iki sorgu çalıştırması gerekir. Bu nedenle, bu yönteme @Transaction ek açıklamasını eklemeniz gerekir. Bu, tüm işlemin atomik olarak çalışmasını sağlar.

Kotlin

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

Java

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