تحديد العلاقات بين شخصين وإجراء طلبات بحث بشأنها

العلاقة بين كيانَين هي علاقة يكون فيها كل مثال من الكيان الرئيسي مرتبطًا بمثال واحد فقط من الكيان الثانوي، والعكس صحيح أيضًا.

على سبيل المثال، لنفترض أنّ هناك تطبيقًا لبث الموسيقى يتضمّن مكتبة أغنيات يملكها المستخدم. لكل مستخدم مكتبة واحدة فقط، وكل مكتبة مرتبطة بمستخدم واحد فقط. لذلك، هناك علاقة بين الكيان 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
)