הגדרה של קשרי גומלין מסוג אחד-לרבים ושליחת שאילתות לגביהם

קשר גומלין מסוג אחד-לרבים בין שתי ישויות הוא קשר שבו כל מופע של ישות האב מתאים לאפס או יותר מופעים של ישות הצאצא, אבל כל מופע של ישות הצאצא יכול להתאים רק למופע אחד של ישות האב.

בדוגמה של אפליקציית סטרימינג של מוזיקה, נניח שהמשתמש יכול לארגן את השירים שלו בפלייליסטים. כל משתמש יכול ליצור כמה פלייליסטים שהוא רוצה, אבל כל פלייליסט נוצר על ידי משתמש אחד בלבד. לכן, יש קשר של אחד לרבים בין הישות User לישות Playlist.

כדי להגדיר שאילתות של קשרים מסוג אחד לרבים במסד הנתונים:

  1. הגדרת הקשר: יוצרים מחלקות לשני הישויות, כאשר ישות הצאצא מפנה למפתח הראשי של ישות האב.
  2. שליחת שאילתה לישויות: יוצרים מודל של הקשר במחלקת נתונים חדשה ומטמיעים method לאחזור הנתונים הקשורים.

הגדרת הקשר

כדי להגדיר קשר של אחד לרבים, קודם יוצרים מחלקה לשני הישויות. בדומה לקשר של אחד לאחד, יש לכלול בישות הבן משתנה שהוא הפניה למפתח הראשי של ישות אם.

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();