تعریف و پُرسمان روابط یک‌به‌یک

رابطه یک‌به‌یک بین دو نهاد رابطه‌ای است که در آن هر نمونه از نهاد والد دقیقاً با یک نمونه از نهاد فرزند مطابقت دارد و برعکس آن نیز صادق است.

برای مثال، برنامه جاری‌سازی موسیقی را درنظر بگیرید که کاربر در آن کتابخانه‌ای از آهنگ‌هایی دارد که مالک آن‌ها است. هر کاربر فقط یک کتابخانه دارد و هر کتابخانه دقیقاً مربوط به یک کاربر است. بنابراین، بین نهاد User و نهاد Library رابطه یک‌به‌یک وجود دارد.

برای تعریف و پُرسمان کردن روابط یک‌به‌یک در پایگاه داده‌تان، این مراحل را دنبال کنید:

  1. تعریف رابطه: برای هر دو نهاد کلاس ایجاد کنید و مطمئن شوید که یکی به کلید اصلی دیگری ارجاع می‌دهد.
  2. پرسش از نهادها: رابطه را در کلاس داده جدیدی مدل‌سازی کنید و تابعی برای بازیابی داده‌های مرتبط ایجاد کنید.

تعریف رابطه

برای تعریف رابطه یک‌به‌یک، ابتدا برای هریک از دو نهاد خود کلاسی ایجاد کنید. یکی از نهادها باید شامل متغیری باشد که به کلید اصلی نهاد دیگر ارجاع می‌دهد.

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

پُرسمان نهادها

برای پُرسمان کردن فهرست کاربران و کتابخانه‌های مربوطه، ابتدا باید رابطه یک‌به‌یک بین دو نهاد را مدل‌سازی کنید.

برای مدل‌سازی رابطه، کلاس داده جدیدی ایجاد کنید که در آن هر نمونه نمونه‌ای از نهاد والد و نهاد فرزند مربوطه را نگهداری کند. گزارمان @Relation را به نهاد فرزند اضافه کنید. parentColumns را روی نام ستون کلید اصلی نهاد والد تنظیم کنید و entityColumns را روی نام ستون نهاد فرزند که به کلید اصلی والد ارجاع می‌دهد تنظیم کنید.

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

درنهایت، تابعی به کلاس شیء دسترسی به داده (DAO) اضافه کنید که همه نمونه‌های کلاس داده را برمی‌گرداند و نهاد والد را با نهاد فرزند جفت می‌کند. برای اطمینان از اینکه Room کل عملیات را به‌صورت اتمی انجام می‌دهد، حاشیه @Transaction را اضافه کنید، زیرا این تابع به Room نیاز دارد تا دو پُرسمان را اجرا کند.

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

کلیدهای ترکیبی

اگر رابطه را بااستفاده از کلیدهای ترکیبی تعریف می‌کنید، چندین ستون را در parentColumns و entityColumns مشخص کنید. ترتیب ستون‌ها در parentColumns باید با ترتیب ستون‌ها در entityColumns مطابقت داشته باشد.

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