SQLite
 sql >> Database >  >> RDS >> SQLite

Come filtrare in una relazione uno a molti con Android Room db

Diamo un'occhiata a come @Relation lavori. Ci sono due fasi:

  1. La stanza esegue la query che hai inserito in @Query per ottenere utenti. Come al solito, quella query non include alcun join. Questa query viene utilizzata per ottenere quella parte di dati che sono persistenti nella tabella principale (User nel tuo caso).
  2. Room esegue un'altra query. Per questo guarda @Relation parametri e capisce quale tabella dovrebbe interrogare successivamente (Record nel tuo caso) e quale dovrebbe essere la condizione di unione con il risultato dell'utente. È importante che tu non abbia modo di intrometterti in questo processo di creazione di query. Non puoi impostare un filtro su Record i campi di , per esempio. Ottenere risultati Room lo trasforma nel formato necessario (riempie List of Records ).

Hai delle scelte:

  1. Per invertire la relazione per impostare filtri su Records table (ma con ciò otterrai dati flat senza List).
public class UserWithRecords {
    @Embedded
    protected Record record;
    @Relation(
            parentColumn = "user_id",
            entity = User.class,
            entityColumn = "id"
    )
    protected User user;
}

e per modificare la query in:

@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
  1. Non usare @Relation a tutti, scrivi query con join come quello che hai provato. Ma poi dovresti trasformare manualmente il risultato nel modulo necessario nel codice (risultato in loop e formazione di List).