تحديد العلاقات من واحد إلى عدة عناصر وإجراء طلبات بحث بشأنها
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
العلاقة بين عنصرَين هي علاقة رأس بأطراف، حيث يرتبط كل مثيل من العنصر الرئيسي بصفر أو أكثر من المثيلات للعنصر الثانوي، ولكن لا يمكن أن يرتبط كل مثيل من العنصر الثانوي إلا بمثيّل واحد بالضبط من العنصر الرئيسي.
في مثال تطبيق بث الموسيقى، لنفترض أنّه يمكن للمستخدم تنظيم
أغانيه في قوائم تشغيل. يمكن لكل مستخدم إنشاء أي عدد يريده من قوائم التشغيل،
ولكن يمكن لمستخدم واحد فقط إنشاء كل قائمة تشغيل. بالتالي، هناك علاقة رأس بأطراف
بين عنصر 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 تُعيد جميع نُسخ فئة data
التي تُقرِن العنصر الرئيسي بالعنصر الفرعي. تتطلّب هذه الطريقة
من Room تنفيذ طلبَي بحث، لذا أضِف التعليق التوضيحي @Transaction
إلى هذه
الطريقة لكي تتم تنفيذ العملية بأكملها بشكلٍ موحّد.
Kotlin
@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Define and query one-to-many relationships\n\nA *one-to-many relationship* between two entities is a relationship where each\ninstance of the parent entity corresponds to zero or more instances of the child\nentity, but each instance of the child entity can only correspond to exactly one\ninstance of the parent entity.\n\nIn the music streaming app example, suppose the user has the ability to organize\ntheir songs into playlists. Each user can create as many playlists as they want,\nbut exactly one user creates each playlist. Therefore, there is a one-to-many\nrelationship between the `User` entity and the `Playlist` entity.\n\nFollow these steps to define and query one-to-many relationships in your\ndatabase:\n\n1. **[Define the relationship](#define)**: Create classes for both entities, with the child entity referencing the parent's primary key.\n2. **[Query the entities](#query)**: Model the relationship in a new data class and implement a method to retrieve the related data.\n\nDefine the relationship\n-----------------------\n\nTo define a one-to-many relationship, first create a class for the two entities.\nAs in a one-to-one relationship, the child entity must include a variable that\nis a reference to the primary key of the parent entity. \n\n### Kotlin\n\n @Entity\n data class User(\n @PrimaryKey val userId: Long,\n val name: String,\n val age: Int\n )\n\n @Entity\n data class Playlist(\n @PrimaryKey val playlistId: Long,\n val userCreatorId: Long,\n val playlistName: String\n )\n\n### Java\n\n @Entity\n public class User {\n @PrimaryKey public long userId;\n public String name;\n public int age;\n }\n\n @Entity\n public class Playlist {\n @PrimaryKey public long playlistId;\n public long userCreatorId;\n public String playlistName;\n }\n\nQuery the entities\n------------------\n\nTo query the list of users and corresponding playlists, you must first model the\none-to-many relationship between the two entities\n\nTo do this, create a new data class where each instance holds an instance of the\nparent entity and a list of all corresponding child entity instances. Add the\n[`@Relation`](/reference/kotlin/androidx/room/Relation) annotation to the instance of the child entity, with\n[`parentColumn`](/reference/kotlin/androidx/room/Relation#parentColumn()) set to the name of the primary key column of the parent\nentity and [`entityColumn`](/reference/kotlin/androidx/room/Relation#entityColumn()) set to the name of the column of the child entity\nthat references the parent entity's primary key. \n\n### Kotlin\n\n data class UserWithPlaylists(\n @Embedded val user: User,\n @Relation(\n parentColumn = \"userId\",\n entityColumn = \"userCreatorId\"\n )\n val playlists: List\u003cPlaylist\u003e\n )\n\n### Java\n\n public class UserWithPlaylists {\n @Embedded public User user;\n @Relation(\n parentColumn = \"userId\",\n entityColumn = \"userCreatorId\"\n )\n public List\u003cPlaylist\u003e playlists;\n }\n\nFinally, add a method to the DAO class that returns all instances of the data\nclass that pairs the parent entity and the child entity. This method requires\nRoom to run two queries, so add the [`@Transaction`](/reference/kotlin/androidx/room/Transaction) annotation to this\nmethod so that the whole operation is performed atomically. \n\n### Kotlin\n\n @Transaction\n @Query(\"SELECT * FROM User\")\n fun getUsersWithPlaylists(): List\u003cUserWithPlaylists\u003e\n\n### Java\n\n @Transaction\n @Query(\"SELECT * FROM User\")\n public List\u003cUserWithPlaylists\u003e getUsersWithPlaylists();"]]