Podívejme se, jak @Relation
funguje. Existují dvě fáze:
- Místnost provede dotaz, který jste vložili do
@Query
zí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 (User
ve vašem případě). - Místnost provede ještě jeden dotaz. Za tímto účelem se dívá na
@Relation
parametry a rozumí, na jakou tabulku by se měl dotazovat jako další (Record
ve 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 naRecord
napří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
Records
tabulky (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
@Relation
vů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).