العلاقة بين عنصرَين هي علاقة ترتبط فيها كل مثيل من العنصر الرئيسي بمثيل واحد بالضبط من العنصر الثانوي، والعكس صحيح أيضًا.
على سبيل المثال، تطبيق لبث الموسيقى يتضمّن مكتبة
أغانٍ يملكها المستخدم يمتلك كل مستخدم مكتبة واحدة فقط، وتكون كل مكتبة مرتبطة بمستخدم واحد بالضبط. بالتالي، هناك علاقة مباشرة
بين عنصر User
وعنصر Library
.
اتّبِع الخطوات التالية لتحديد العلاقات بين عنصرَين والبحث عنها في قاعدة بياناتك:
- تحديد العلاقة: أنشئ فئات لكلا الكيانَين، مع التأكّد من أنّ أحدهما يشير إلى المفتاح الأساسي للآخر.
- طلب الكيانات: يمكنك وضع نموذج للعلاقة في فئة بيانات جديدة وإنشاء طريقة لاسترداد البيانات ذات الصلة.
تحديد العلاقة
لتحديد علاقة بين عنصرَين، عليك أولاً إنشاء فئة لكل من العنصرَين. يجب أن يتضمّن أحد الكيانَين متغيّرًا يشير إلى المفتاح الأساسي للكيان الآخر.
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;
}
طلب الكيانات
لإجراء طلب بحث عن قائمة المستخدمين والمكتبات المقابلة، يجب أولاً وضع نموذج للعلاقة بين الكيانَين.
لإجراء ذلك، أنشئ فئة بيانات جديدة يحتوي كل مثيل فيها على مثيل من
العنصر الرئيسي والمثيل المقابل للعنصر الفرعي. أضِف التعليق التوضيحي
@Relation
إلى مثيل العنصر الفرعي، مع ضبط
parentColumn
على اسم عمود المفتاح الأساسي للعنصر
الرئيسي وentityColumn
على اسم عمود العنصر الفرعي
الذي يشير إلى المفتاح الأساسي للعنصر الرئيسي.
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;
}
أخيرًا، أضِف طريقة إلى فئة DAO تُعيد جميع نُسخ فئة data
التي تُقرِن العنصر الرئيسي بالعنصر الفرعي. تتطلّب هذه الطريقة
مساحة لإجراء طلبَي بحث. لذلك، عليك إضافة التعليق التوضيحي @Transaction
إلى هذه الطريقة. ويضمن ذلك تنفيذ العملية بأكملها
بشكل دقيق.
Kotlin
@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();