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

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

في مثال تطبيق بث الموسيقى، لنفترض أنّه يمكن للمستخدم تنظيم أغانيه في قوائم تشغيل. يمكن لكل مستخدم إنشاء أي عدد يريده من قوائم التشغيل، ولكن يمكن لمستخدم واحد فقط إنشاء كل قائمة تشغيل. بالتالي، هناك علاقة رأس بأطراف بين عنصر User وعنصر Playlist.

اتّبِع الخطوات التالية لتحديد العلاقات بين عنصرَين وطرح طلبات بحث عنها في قاعدة البيانات:

  1. تحديد العلاقة: أنشئ صفوفًا لكلا الكيانَين، مع الإشارة إلى المفتاح الأساسي للعنصر الرئيسي في العنصر الفرعي.
  2. طلب البحث عن الكيانات: يمكنك وضع نموذج للعلاقة في فئة بيانات جديدة وتنفيذ طريقة لاسترداد البيانات ذات الصلة.

تحديد العلاقة

لتحديد علاقة بين عنصرَين، أنشئ أولاً فئة للعنصرَين. كما هو الحال في العلاقة بين عنصرَين، يجب أن يتضمّن العنصر الثانوي متغيّرًا يشير إلى المفتاح الأساسي للعنصر الأساسي.

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 تُعيد جميع نُسخ فئة data التي تُقرِن العنصر الرئيسي بالعنصر الفرعي. تتطلّب هذه الطريقة من Room تنفيذ طلبَي بحث، لذا أضِف التعليق التوضيحي @Transaction إلى هذه الطريقة لكي تتم تنفيذ العملية بأكملها بشكلٍ موحّد.

Kotlin

@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>

Java

@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();