Zobaczmy, jak @Relation
Pracuje. Istnieją dwa etapy:
- Pokój wykonuje zapytanie, które umieściłeś w
@Query
aby zdobyć użytkowników. Jak zwykle to zapytanie nie zawiera żadnych sprzężeń. To zapytanie służy do pobrania tej części danych, które są utrwalone w głównej tabeli (User
w twoim przypadku). - Pokój wykonuje jeszcze jedno zapytanie. W tym celu wygląda na
@Relation
parametry i rozumie, do jakiej tabeli powinien wykonać zapytanie (Record
w Twoim przypadku) i jaki powinien być warunek dołączenia do wyniku użytkownika. Ważne jest, abyś nie miał możliwości ingerowania w ten proces tworzenia zapytania. Nie możesz ustawić filtra naRecord
na przykład pola 's. Pobieranie wyniku Room przekształca go w wymagany format (wypełnia ListęRecords
).
Masz wybór:
- Aby odwrócić relację, aby ustawić filtry na
Records
tabela (ale dzięki temu uzyskasz płaskie dane bez listy).
public class UserWithRecords {
@Embedded
protected Record record;
@Relation(
parentColumn = "user_id",
entity = User.class,
entityColumn = "id"
)
protected User user;
}
i zmienić zapytanie na:
@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
- Nie używać
@Relation
w ogóle napisz zapytanie z sprzężeniami, które próbowałeś. Ale wtedy powinieneś ręcznie przekształcić wynik do potrzebnej postaci w kodzie (zapętlanie wyniku i tworzenie listy).