Låt oss titta på hur @Relation
Arbetar. Det finns två steg:
- Rum kör en fråga som du har lagt in i
@Query
fö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 (User
i ditt fall). - Rummet kör ytterligare en fråga. För det tittar den på
@Relation
parametrar och förstår vilken tabell den ska fråga härnäst (Record
i 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åRecord
s 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å
Records
tabell (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
@Relation
alls, 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).