Podívejme se, jak @Relation funguje. Existují dvě fáze:
- Místnost provede dotaz, který jste vložili do
@Queryzískat uživatele. Jako obvykle tento dotaz neobsahuje žádné spojení. Tento dotaz se používá k získání té části dat, která jsou uložena v hlavní tabulce (Userve vašem případě). - Místnost provede ještě jeden dotaz. Za tímto účelem se dívá na
@Relationparametry a rozumí, na jakou tabulku by se měl dotazovat jako další (Recordve vašem případě) a jaká by měla být podmínka spojení s výsledkem uživatele. Je důležité, abyste do tohoto procesu vytváření dotazů nemohli nijak zasahovat. Nemůžete nastavit filtr naRecordnapříklad pole . Získání výsledku Room jej převede do potřebného formátu (vyplní SeznamRecords).
Máte na výběr:
- Chcete-li obrátit vztah k nastavení filtrů na
Recordstabulky (ale s tím získáte plochá data bez Seznamu).
public class UserWithRecords {
@Embedded
protected Record record;
@Relation(
parentColumn = "user_id",
entity = User.class,
entityColumn = "id"
)
protected User user;
}
a změnit dotaz na:
@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
- Nepoužívat
@Relationvůbec, napište dotaz s připojeními, jako jste to zkusili. Ale pak byste měli ručně transformovat výsledek do potřebné formy v kódu (optimalizace výsledku a formování seznamu).