Room:如何用单DAO方法获取专辑和所有歌曲

Room: How to get albums and all songs with single DAO method

假设一个包含艺术家、专辑和歌曲的数据库模式,其中一个艺术家可以有很多专辑,一个专辑可以有很多歌曲,有没有办法定义一个 DAO 方法,让我得到所有专辑的列表以及每张专辑的所有歌曲?

我知道我可以通过这样的方式获取歌曲和专辑:

@Query("SELECT * FROM Song s JOIN Album a ON s.albumId = a.id")
List<SongAndAlbum> loadSongAndAlbum();

但我不知道如何定义一个查询来提供所有专辑和搜索专辑中所有歌曲的列表。

假设你有这样的方案:

@Entity
public class Artist {
    @PrimaryKey public long Id;
    public String name;
}

@Entity
public class Album {
    @PrimaryKey public long Id;
    public String name;
    public int artistId;
}
@Entity
public class Song {
    @PrimaryKey public long Id;
    public String name;
    public int albumId;
}

要获取专辑列表,每张专辑都包含歌曲列表,您可以使用 Room's Relations:

public class AlbumWithSongs {
    @Embedded public Album album;
    @Relation(
         parentColumn = "id",
         entityColumn = "albumId"
    )
    public List<Song> songs;
}

你的dao方法应该是:

@Query("SELECT * FROM Album")
List<AlbumWithSongs> loadAlbumWithSongs();

如果除此之外你还想获得每个艺术家持有专辑列表的艺术家列表,你应该再添加一个 class:

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

你的 dao 方法应该是:

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