Bire bir ilişkileri tanımlama ve sorgulama

İki varlık arasındaki bire bir ilişki, ana varlığın her örneğinin alt varlığın tam olarak bir ö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 ve birinin diğerinin birincil anahtarına referans verdiğinden emin olun.
  2. Varlıkları sorgulama: İlişkiyi yeni bir veri sınıfında modelleyin ve ilgili verileri almak için bir işlev oluşturun.

İlişkiyi tanımlama

Bire bir ilişki tanımlamak için öncelikle 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.

@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
)

Varlıkları sorgulama

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

İlişkiyi modellemek için her örneğin ana varlık örneğini ve ilgili alt öğe varlık örneğini barındırdığı yeni bir veri sınıfı oluşturun. Alt öğeye @Relation ek açıklamasını ekleyin. parentColumns değerini üst varlığın birincil anahtar sütununun adı olarak, entityColumns değerini ise üst öğenin birincil anahtarına referans veren alt varlığın sütununun adı olarak ayarlayın.

data class UserAndLibrary(
    @Embedded val user: User,
    @Relation(
        parentColumns = ["userId"],
        entityColumns = ["userOwnerId"]
    )
    val library: Library
)

Son olarak, ana varlığı alt varlıkla 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. Bu işlevin iki sorgu çalıştırması gerektiğinden Room'un tüm işlemi atomik olarak gerçekleştirmesini sağlamak için @Transaction ek açıklamasını ekleyin.

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

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 Library(
    @PrimaryKey val libraryId: Long,
    val userFirstName: String,
    val userLastName: String
)

data class UserAndLibrary(
    @Embedded val user: User,
    @Relation(
        parentColumns = ["firstName", "lastName"],
        entityColumns = ["userFirstName", "userLastName"]
    )
    val library: Library
)