تعریف و پرس و جو روابط یک به چند، تعریف و پرس و جو روابط یک به چند
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
رابطه یک به چند بین دو موجودیت رابطه ای است که در آن هر نمونه از موجودیت اصلی با صفر یا چند نمونه از موجودیت فرزند مطابقت دارد، اما هر نمونه از موجودیت فرزند فقط می تواند دقیقاً با یک نمونه از موجودیت اصلی مطابقت داشته باشد.
در مثال برنامه پخش موسیقی، فرض کنید کاربر توانایی سازماندهی آهنگ های خود را در لیست های پخش دارد. هر کاربر می تواند هر تعداد لیست پخش که می خواهد ایجاد کند، اما دقیقاً یک کاربر هر لیست پخش را ایجاد می کند. بنابراین، یک رابطه یک به چند بین موجودیت User
و موجودیت Playlist
وجود دارد.
این مراحل را برای تعریف و جستجوی روابط یک به چند در پایگاه داده خود دنبال کنید:
- تعریف رابطه : کلاس هایی را برای هر دو موجودیت ایجاد کنید، با نهاد فرزند به کلید اصلی والد ارجاع دهد.
- پرس و جو از موجودیت ها : رابطه را در یک کلاس داده جدید مدل کنید و روشی را برای بازیابی داده های مرتبط پیاده سازی کنید.
رابطه را تعریف کنید
برای تعریف رابطه یک به چند، ابتدا یک کلاس برای دو موجودیت ایجاد کنید. همانطور که در رابطه یک به یک، موجودیت فرزند باید متغیری را شامل شود که ارجاع به کلید اصلی موجودیت والد است.
کاتلین
@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
)
جاوا
@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
به نام ستون موجودیت فرزند که به کلید اصلی موجودیت والد ارجاع میدهد.
کاتلین
data class UserWithPlaylists(
@Embedded val user: User,
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
val playlists: List<Playlist>
)
جاوا
public class UserWithPlaylists {
@Embedded public User user;
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
public List<Playlist> playlists;
}
در نهایت، متدی را به کلاس DAO اضافه کنید که تمام نمونه های کلاس داده را که موجودیت والد و موجودیت فرزند را جفت می کند، برمی گرداند. این روش برای اجرای دو کوئری به Room نیاز دارد، بنابراین حاشیه نویسی @Transaction
را به این روش اضافه کنید تا کل عملیات به صورت اتمی انجام شود.
کاتلین
@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>
جاوا
@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","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-29 بهوقت ساعت هماهنگ جهانی."],[],[],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();"]]