Regardons comment @Relation
œuvres. Il y a deux étapes :
- 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). - 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 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
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);
- 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).