הגדרה של קשרי גומלין מסוג אחד-לרבים ושליחת שאילתות לגביהם
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
קשר אחד-ל-רבים בין שתי ישויות הוא קשר שבו כל מופע של הישות ההורה תואם לאפס או יותר מופעים של הישות הצאצא, אבל כל מופע של הישות הצאצא יכול להתאים רק למופע אחד בלבד של הישות ההורה.
בדוגמה של אפליקציית הסטרימינג של המוזיקה, נניח שהמשתמש יכול לארגן את השירים שלו בפלייליסטים. כל משתמש יכול ליצור כמה פלייליסטים שירצה, אבל כל פלייליסט נוצר על ידי משתמש אחד בלבד. לכן, יש קשר אחד-ל-רבים בין הישות 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();
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-27 (שעון UTC).
[[["התוכן קל להבנה","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 (שעון UTC)."],[],[],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();"]]