Definire e eseguire query sulle relazioni one-to-one

Una relazione one-to-one tra due entità è una relazione in cui ogni istanza dell'entità padre corrisponde esattamente a un'istanza dell'entità figlio e viceversa.

Ad esempio, considera un'app di streaming musicale in cui l'utente ha una raccolta di brani di sua proprietà. Ogni utente ha una sola raccolta e ogni raccolta corrisponde esattamente a un utente. Pertanto, esiste una relazione one-to-one tra l'entità User e l'entità Library.

Per definire ed eseguire query sulle relazioni one-to-one nel database:

  1. Definisci la relazione: crea classi per entrambe le entità, assicurandoti che una faccia riferimento alla chiave primaria dell'altra.
  2. Esegui query sulle entità: modella la relazione in una nuova classe di dati e crea un metodo per recuperare i dati correlati.

Definisci la relazione

Per definire una relazione one-to-one, crea prima una classe per ciascuna delle due entità. Una delle entità deve includere una variabile che sia un riferimento alla chiave primaria dell'altra entità.

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;
}

Esegui query sulle entità

Per eseguire query sull'elenco degli utenti e delle raccolte corrispondenti, devi prima modellare la relazione one-to-one tra le due entità.

A questo scopo, crea una nuova classe di dati in cui ogni istanza contiene un'istanza dell'entità padre e l'istanza corrispondente dell'entità figlio. Aggiungi l' @Relation annotazione all'istanza dell'entità figlio, con parentColumn impostato sul nome della colonna della chiave primaria dell'entità padre e entityColumn impostato sul nome della colonna dell'entità figlio che fa riferimento alla chiave primaria dell'entità padre.

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;
}

Infine, aggiungi un metodo alla classe DAO che restituisce tutte le istanze della classe di dati che accoppia l'entità padre e l'entità figlio. Questo metodo richiede a Room di eseguire due query. Pertanto, devi aggiungere l'@Transaction annotazione a questo metodo. In questo modo, l'intera operazione viene eseguita in modo atomico.

Kotlin

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

Java

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