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