SQLite
 sql >> Datenbank >  >> RDS >> SQLite

So filtern Sie in einer zu vielen Beziehung mit Android Room db

Sehen wir uns an, wie @Relation funktioniert. Es gibt zwei Stufen:

  1. 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).
  2. 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 auf Record setzen 's Felder, zum Beispiel. Ergebnis erhalten Room transformiert es in das benötigte Format (füllt die Liste der Records ).

Sie haben die Wahl:

  1. 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);
  1. 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).