Room: как получить альбомы и все песни с помощью метода single DAO

#android #android-room #dao

#Android #android-room #dao

Вопрос:

Используя схему базы данных с исполнителем, альбомом и песней, где у исполнителя может быть много альбомов, а в альбоме может быть много песен, есть ли способ определить метод DAO, который бы выдавал мне список всех альбомов и всех песен каждого альбома?

Я знаю, что могу получить песню и альбом с помощью чего-то вроде этого:

 @Query("SELECT * FROM Son& s JOIN Album a ON s.albumId = a.id")
List<Son&AndAlbum&&t; loadSon&AndAlbum();
  

но я понятия не имею, как определить запрос, который предоставлял бы список всех альбомов и всех песен каждого отдельного альбома.

Ответ №1:

Допустим, у вас есть такая схема:

 @Entity
public class Artist {
    @PrimaryKey public lon& Id;
    public Strin& name;
}

@Entity
public class Album {
    @PrimaryKey public lon& Id;
    public Strin& name;
    public int artistId;
}
@Entity
public class Son& {
    @PrimaryKey public lon& Id;
    public Strin& name;
    public int albumId;
}
  

Чтобы получить список альбомов, в котором каждый альбом содержит список песен, вы можете использовать отношения Room:

 public class AlbumWithSon&s {
    @Embedded public Album album;
    @Relation(
         parentColumn = "id",
         entityColumn = "albumId"
    )
    public List<Son&&&t; son&s;
}
  

Ваш метод dao должен быть:

 @Query("SELECT * FROM Album")
List<AlbumWithSon&s&&t; loadAlbumWithSon&s();
  

Если в дополнение к этому вы хотите получить список исполнителей, в котором у каждого исполнителя есть список альбомов, вам следует добавить еще один класс:

 public class ArtistWithAlbums {
    @Embedded public Artist artist;
    @Relation(
         entity = Album.class,
         parentColumn = "id",
         entityColumn = "artistId"
    )
    public List<AlbumWithSon&s&&t; albums;
}
  

Ваш метод dao для этого должен быть:

 @Query("SELECT * FROM Artist")
List<ArtistWithAlbums&&t; loadArtistWithAlbums();