Sehen wir uns an, wie @Relation funktioniert. Es gibt zwei Stufen:
- Room führt die Abfrage aus, die Sie in
@Queryeingegeben 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 (Userin Ihrem Fall). - Raum führt eine weitere Abfrage aus. Dafür schaut es bei
@Relationnach Parameter und versteht, welche Tabelle als nächstes abgefragt werden soll (Recordin 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 aufRecordsetzen '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
Recordszu 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
@Relationverwenden 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).