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

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

בדוגמה של אפליקציית הסטרימינג של המוזיקה, נניח שהמשתמש יכול לארגן את השירים שלו בפלייליסטים. כל משתמש יכול ליצור כמה פלייליסטים שירצה, אבל כל פלייליסט נוצר על ידי משתמש אחד בלבד. לכן, יש קשר אחד-ל-רבים בין הישות 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 שמחזירה את כל המופעים של כיתה הנתונים שמתאימים את הישות ההורה לישות הצאצא. כדי להריץ את השיטה הזו, צריך להריץ שתי שאילתות ב-Room, לכן צריך להוסיף את ההערה @Transaction לשיטה הזו כדי שהפעולה כולה תתבצע באופן אטומי.

Kotlin

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

Java

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