روابط یک به یک را تعریف و پرس و جو کنید

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

برای مثال، یک برنامه پخش موسیقی را در نظر بگیرید که در آن کاربر یک کتابخانه از آهنگ‌های متعلق به خود دارد. هر کاربر فقط یک کتابخانه دارد و هر کتابخانه دقیقاً مربوط به یک کاربر است. بنابراین، یک رابطه یک به یک بین موجودیت 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) اضافه کنید که تمام نمونه‌های کلاس داده‌ای را که موجودیت والد را با موجودیت فرزند جفت می‌کند، برمی‌گرداند. حاشیه‌نویسی @Transaction را اضافه کنید تا مطمئن شوید که Room کل عملیات را به صورت خودکار انجام می‌دهد، زیرا این تابع به 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
)