Regardons comment @Relation œuvres. Il y a deux étapes :
- Room exécute la requête que vous avez placée dans
@Querypour 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 (Userdans votre cas). - Room exécute une autre requête. Pour cela, il regarde
@Relationparamètres et comprend quelle table il doit interroger ensuite (Recorddans 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 surRecord, par exemple. Obtenir le résultat Room le transforme au format requis (remplit la liste desRecords).
Vous avez le choix :
- Pour inverser la relation afin de définir des filtres sur
Recordstable (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);
- Ne pas utiliser
@Relationdu 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).