علاقة رأس بأطراف بين كيانين هي علاقة يكون فيها كل مثيل من الكيان الرئيسي مرتبطًا بصفر أو أكثر من مثيلات الكيان التابع، ولكن كل مثيل من الكيان التابع يمكن أن يكون مرتبطًا بمثيل واحد فقط من الكيان الرئيسي.
في مثال تطبيق بث الموسيقى، لنفترض أنّ المستخدم يمكنه تنظيم أغانيه في قوائم تشغيل. يمكن لكل مستخدم إنشاء العدد الذي يريده من قوائم التشغيل،
ولكن يمكن لمستخدم واحد فقط إنشاء كل قائمة تشغيل. لذلك، هناك علاقة رأس بأطراف بين الكيان User والكيان Playlist.
اتّبِع الخطوات التالية لتحديد علاقات "واحد إلى متعدد" والاستعلام عنها في قاعدة البيانات:
- تحديد العلاقة: أنشئ فئات لكل من الكيانين، مع الإشارة إلى المفتاح الأساسي للكيان الأصل في الكيان الفرعي.
- طلب البحث عن الكيانات: صمِّم العلاقة في فئة بيانات جديدة واستخدِم طريقة لاسترداد البيانات ذات الصلة.
تحديد العلاقة
لتحديد علاقة بين عنصرين، أنشئ أولاً فئة للعنصرين. كما هو الحال في العلاقة بين عنصرين، يجب أن يتضمّن العنصر التابع متغيّرًا يشير إلى المفتاح الأساسي للعنصر الرئيسي.
Kotlin
@Entity
data class User(
@PrimaryKey val userId: Long,
val name: String,
val age: Int
)
@Entity
data class Playlist(
@PrimaryKey val playlistId: Long,
val userCreatorId: Long,
val playlistName: String
)
Java
@Entity
public class User {
@PrimaryKey public long userId;
public String name;
public int age;
}
@Entity
public class Playlist {
@PrimaryKey public long playlistId;
public long userCreatorId;
public String playlistName;
}
طلب الكيانات
للاستعلام عن قائمة المستخدمين وقوائم التشغيل المقابلة، عليك أولاً تصميم العلاقة بين الكيانين، وهي علاقة واحد إلى متعدد
لإجراء ذلك، أنشئ فئة بيانات جديدة يتضمّن كل مثيل فيها مثيلاً للكيان الرئيسي وقائمة بجميع مثيلات الكيان الثانوي المقابلة. أضِف التعليق التوضيحي
@Relation إلى مثيل العنصر الفرعي، مع ضبط
parentColumn على اسم عمود المفتاح الأساسي للعنصر الرئيسي،
وضبط entityColumn على اسم عمود العنصر الفرعي الذي يشير إلى المفتاح الأساسي للعنصر الرئيسي.
Kotlin
data class UserWithPlaylists(
@Embedded val user: User,
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
val playlists: List<Playlist>
)
Java
public class UserWithPlaylists {
@Embedded public User user;
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
public List<Playlist> playlists;
}
أخيرًا، أضِف طريقة إلى فئة DAO تعرض جميع مثيلات فئة البيانات التي تربط العنصر الرئيسي بالعنصر الفرعي. تتطلّب هذه الطريقة أن ينفّذ Room طلبَي بحث، لذا أضِف التعليق التوضيحي @Transaction إلى هذه الطريقة لكي يتم تنفيذ العملية بأكملها بشكل ذري.
Kotlin
@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();