קשר אחד-לאחד בין שתי ישויות הוא קשר שבו כל מופע של הישות ההורה תואם למופע אחד בלבד של הישות הצאצא, ולהפך.
לדוגמה, נניח שיש אפליקציית סטרימינג של מוזיקה שבה למשתמש יש ספרייה של שירים שבבעלותו. לכל משתמש יש רק ספרייה אחת, וכל ספרייה תואמת למשתמש אחד בלבד. לכן, יש קשר אחד לאחד בין הישות User
לישות Library
.
כדי להגדיר יחסי אחד-לאחד במסד הנתונים ולבצע שאילתות לגביהן:
- הגדרת הקשר: יוצרים כיתות לשני הישויות, ומוודאים שאחד מהם מפנה למפתח הראשי של השני.
- שליחת שאילתה לישויות: יוצרים מודל של הקשר בכיתה נתונים חדשה ויוצרים שיטה לאחזור הנתונים הקשורים.
הגדרת הקשר
כדי להגדיר קשר אחד-לאחד, קודם צריך ליצור כיתה לכל אחת משתי הישות. אחת מהישויות חייבת לכלול משתנה שהוא הפניה למפתח הראשי של הישות השנייה.
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();