Laten we eens kijken hoe @Relation
werken. Er zijn twee fasen:
- Ruimte voert zoekopdracht uit die u in
@Query
heeft geplaatst gebruikers te krijgen. Zoals gewoonlijk bevat die zoekopdracht geen Joins. Deze query wordt gebruikt om dat deel van de gegevens op te halen dat in de hoofdtabel staat (User
in jouw geval). - Room voert nog een query uit. Daarvoor kijkt het naar
@Relation
parameters en begrijpt welke tabel het vervolgens moet opvragen (Record
in uw geval) en wat de join-voorwaarde zou moeten zijn met het resultaat van de gebruiker. Het is belangrijk dat u zich op geen enkele manier kunt bemoeien met dit proces voor het maken van query's. U kunt geen filter instellen opRecord
's velden, bijvoorbeeld. Resultaat krijgen Room transformeert het in het benodigde formaat (vult Lijst metRecords
in) ).
Je hebt keuzes:
- Om de relatie om te draaien om filters in te stellen op
Records
tabel (maar daarmee krijg je platte gegevens zonder lijst).
public class UserWithRecords {
@Embedded
protected Record record;
@Relation(
parentColumn = "user_id",
entity = User.class,
entityColumn = "id"
)
protected User user;
}
en om de zoekopdracht te wijzigen in:
@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
- Niet gebruiken
@Relation
schrijf in ieder geval een query met Joins zoals je hebt geprobeerd. Maar dan moet je het resultaat handmatig in code omzetten in de benodigde vorm (loopresultaat en lijst vormen).