Sehen wir uns an, wie @Relation
funktioniert. Es gibt zwei Stufen:
- Room führt die Abfrage aus, die Sie in
@Query
eingegeben haben Benutzer zu bekommen. Wie üblich enthält diese Abfrage keine Joins. Diese Abfrage wird verwendet, um den Teil der Daten abzurufen, die in der Haupttabelle (User
in Ihrem Fall). - Raum führt eine weitere Abfrage aus. Dafür schaut es bei
@Relation
nach Parameter und versteht, welche Tabelle als nächstes abgefragt werden soll (Record
in Ihrem Fall) und was die Join-Bedingung mit dem Ergebnis des Benutzers sein sollte. Es ist wichtig, dass Sie keine Möglichkeit haben, in diesen Abfrageprozess einzugreifen. Sie können keinen Filter aufRecord
setzen 's Felder, zum Beispiel. Ergebnis erhalten Room transformiert es in das benötigte Format (füllt die Liste derRecords
).
Sie haben die Wahl:
- Um die Beziehung umzukehren, um Filter auf
Records
zu setzen Tabelle (aber damit erhalten Sie flache Daten ohne Liste).
public class UserWithRecords {
@Embedded
protected Record record;
@Relation(
parentColumn = "user_id",
entity = User.class,
entityColumn = "id"
)
protected User user;
}
und um die Abfrage zu ändern in:
@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
- Nicht
@Relation
verwenden Schreiben Sie überhaupt eine Abfrage mit Joins, die Sie versucht haben. Aber dann sollten Sie das Ergebnis manuell in die benötigte Form im Code umwandeln (Ergebnisschleife und Liste bilden).