Lad os se på hvordan @Relation
arbejder. Der er to trin:
- Room udfører forespørgsel, du har indsat i
@Query
at få brugere. Som sædvanlig inkluderer denne forespørgsel ikke nogen tilslutninger. Denne forespørgsel bruges til at hente den del af data, der er fastholdt i hovedtabellen (User
i dit tilfælde). - Rum udfører endnu en forespørgsel. Til det ser den på
@Relation
parametre og forstår, hvilken tabel den skal forespørge efter (Record
i dit tilfælde) og hvad der skal være join-condition med brugerens resultat. Det er vigtigt, at du ikke har nogen mulighed for at trænge ind i denne forespørgselsproces. Du kan ikke indstille filter påRecord
's felter f.eks. Få resultat Room transformerer det i det nødvendige format (udfylder Liste overRecords
).
Du har valgmuligheder:
- At vende om i forhold til at indstille filtre på
Records
tabel (men med det får du flade data uden List).
public class UserWithRecords {
@Embedded
protected Record record;
@Relation(
parentColumn = "user_id",
entity = User.class,
entityColumn = "id"
)
protected User user;
}
og for at ændre forespørgsel til:
@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
- Du må ikke bruge
@Relation
overhovedet, skriv en forespørgsel med Joins, som du har prøvet. Men så skal du manuelt transformere resultatet til den nødvendige form i kode (løkkeresultat og danne liste).