Laten we eens kijken hoe @Relation werken. Er zijn twee fasen:
- Ruimte voert zoekopdracht uit die u in
@Queryheeft 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 (Userin jouw geval). - Room voert nog een query uit. Daarvoor kijkt het naar
@Relationparameters en begrijpt welke tabel het vervolgens moet opvragen (Recordin 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 metRecordsin) ).
Je hebt keuzes:
- Om de relatie om te draaien om filters in te stellen op
Recordstabel (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
@Relationschrijf 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).