Låt oss titta på hur @Relation Arbetar. Det finns två steg:
- Rum kör en fråga som du har lagt in i
@Queryför att få användare. Som vanligt innehåller den frågan inga Joins. Den här frågan används för att hämta den del av data som finns kvar i huvudtabellen (Useri ditt fall). - Rummet kör ytterligare en fråga. För det tittar den på
@Relationparametrar och förstår vilken tabell den ska fråga härnäst (Recordi ditt fall) och vad som ska vara join-condition med användarens resultat. Det är viktigt att du inte har något sätt att inkräkta på den här frågeprocessen. Du kan inte ställa in filter påRecords fält, till exempel. Få resultat Room omvandlar det till önskat format (fyller Lista överRecords). ).
Du har val:
- För att vända på förhållandet till att ställa in filter på
Recordstabell (men med det får du platt data utan List).
public class UserWithRecords {
@Embedded
protected Record record;
@Relation(
parentColumn = "user_id",
entity = User.class,
entityColumn = "id"
)
protected User user;
}
och för att ändra fråga till:
@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
- För att inte använda
@Relationalls, skriv en fråga med Joins som du har provat. Men då bör du manuellt transformera resultatet till önskad form i kod (slingresultat och bildande av lista).