如何在 Android 房间交叉引用实体中查询特殊"many-to-many relationship"用例的数据?



我遵循android开发指南定义了房间多对多关系:https://developer.android.com/training/data-storage/room/relationships#many-到许多

data class Playlist(
@PrimaryKey val playlistId: Long,
val playlistName: String
)
@Entity
data class Song(
@PrimaryKey val songId: Long,
val songName: String,
val artist: String
)
@Entity(primaryKeys = ["playlistId", "songId"])
data class PlaylistSongCrossRef(
val playlistId: Long,
val songId: Long
)
data class PlaylistWithSongs(
@Embedded val playlist: Playlist,
@Relation(
parentColumn = "playlistId",
entityColumn = "songId",
associateBy = @Junction(PlaylistSongCrossRef::class)
)
val songs: List<Song>
)
// Dao
@Transaction
@Query("SELECT * FROM Playlist")
fun getPlaylistsWithSongs(): List<PlaylistWithSongs>

以上操作很好。然而,我也想根据歌曲所属的播放列表来保存歌曲的声音属性(即基本音量…(。对于同一首歌,当它处于";聚会;播放列表并且当它处于"低"时为低;冷却";播放列表。类似于同一播放列表,某些歌曲的音量较高,其余歌曲的音量较低。

所以我更改了上面的播放列表SongCrossRef,并添加了刀如下:

@Entity(table="playlistSongCrossRef", primaryKeys = ["playlistId", "songId"])
data class PlaylistSongCrossRef(
val playlistId: Long,
val songId: Long,
val baseVolume: Double
)
data class PlaylistWithSongs(
@Embedded val playlist: Playlist,
@Relation(
parentColumn = "playlistId",
entityColumn = "songId",
associateBy = Junction(PlaylistSongCrossRef::class)
)
val songs: List<Song>
@Relation(
parentColumn = "playlistId",
entityColumn = "baseVolume",
associateBy = Junction(PlaylistSongCrossRef::class)
)
val baseVolumes: List<PlaylistSongCrossRef>
)
// Dao
@Query("SELECT * FROM Playlist WHERE playlistId = :playlistId ")
fun getPlaylistsWithSongs(playlistId: Int): List<PlaylistWithSongs>

但是,dao查询并没有按预期工作。当相同的baseVolume存储在不同的歌曲播放列表CrossRef对中时,查询将返回重复的条目。

我不确定这是不是dao中的错误查询,或者我需要重新设计Room DB结构。提前感谢您!

data class PlaylistWithSongs(
@Embedded val playlist: Playlist,
@Relation(
parentColumn = "playlistId",
entityColumn = "songId",
associateBy = Junction(PlaylistSongCrossRef::class)
)
val songs: List<Song>
@Relation(
entity = PlaylistSongCrossRef::class,
parentColumn = "playlistId"
entityColumn = "playlistId"
)
val baseVolumes: List<PlaylistSongCrossRef>
)

将后一个关系更改为此关系,您将获得相应的CrossRef列表。

最新更新