SQLite
 sql >> Base de données >  >> RDS >> SQLite

Comment filtrer une relation un à plusieurs avec la base de données de la salle Android

Regardons comment @Relation œuvres. Il y a deux étapes :

  1. Room exécute la requête que vous avez placée dans @Query pour obtenir des utilisateurs. Comme d'habitude, cette requête n'inclut aucune jointure. Cette requête est utilisée pour obtenir la partie des données qui sont conservées dans la table principale (User dans votre cas).
  2. Room exécute une autre requête. Pour cela, il regarde @Relation paramètres et comprend quelle table il doit interroger ensuite (Record dans votre cas) et quelle devrait être la condition de jointure avec le résultat de l'utilisateur. Il est important que vous n'ayez aucun moyen de vous immiscer dans ce processus de création de requêtes. Vous ne pouvez pas définir de filtre sur Record , par exemple. Obtenir le résultat Room le transforme au format requis (remplit la liste des Records ).

Vous avez le choix :

  1. Pour inverser la relation afin de définir des filtres sur Records table (mais avec cela, vous obtiendrez des données plates sans liste).
public class UserWithRecords {
    @Embedded
    protected Record record;
    @Relation(
            parentColumn = "user_id",
            entity = User.class,
            entityColumn = "id"
    )
    protected User user;
}

et pour changer la requête en :

@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
  1. Ne pas utiliser @Relation du tout, écrivez une requête avec des jointures comme celle que vous avez essayée. Mais ensuite, vous devez transformer manuellement le résultat en la forme nécessaire dans le code (résultat en boucle et liste de formation).