הגדרה של קשרים אחד לאחד ושליחת שאילתות לגבי קשרים כאלה

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

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

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

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

הגדרת הקשר

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

Kotlin

@Entity
data class User(
    @PrimaryKey val userId: Long,
    val name: String,
    val age: Int
)

@Entity
data class Library(
    @PrimaryKey val libraryId: Long,
    val userOwnerId: Long
)

Java

@Entity
public class User {
    @PrimaryKey public long userId;
    public String name;
    public int age;
}

@Entity
public class Library {
    @PrimaryKey public long libraryId;
    public long userOwnerId;
}

שליחת שאילתה לגבי הישויות

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

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

Kotlin

data class UserAndLibrary(
    @Embedded val user: User,
    @Relation(
         parentColumn = "userId",
         entityColumn = "userOwnerId"
    )
    val library: Library
)

Java

public class UserAndLibrary {
    @Embedded public User user;
    @Relation(
         parentColumn = "userId",
         entityColumn = "userOwnerId"
    )
    public Library library;
}

לבסוף, מוסיפים שיטה למחלקת ה-DAO שמחזירה את כל המופעים של מחלקת הנתונים שמקשרת בין ישות האם לישות הצאצא. כדי להשתמש בשיטה הזו, צריך להריץ שתי שאילתות ב-Room. לכן, צריך להוסיף את ההערה @Transaction לשיטה הזו. כך אפשר לוודא שהפעולה כולה תתבצע באופן אטומי.

Kotlin

@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>

Java

@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();