【发布时间】:2020-02-18 18:09:45
【问题描述】:
我将如何建模https://developer.android.com/training/data-storage/room/relationships#many-to-many 中描述的多对多关系,但在联结点上有一个附加属性?我基本上想实现以下目标:
@Entity
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,
val rating: Int // <-- the additional property
)
data class PlaylistWithRating(
val playlist: Playlist,
val rating: Int // <-- the additional property
)
data class SongWithPlaylists(
@Embedded val song: Song,
@Relation(
parentColumn = "songId",
entityColumn = "playlistId",
associateBy = @Junction(PlaylistSongCrossRef::class)
)
val playlists: List<PlaylistWithRating>
)
所以我可以在我的 Dao 中访问它:
@Dao
interface SongWithPlaylistsDao {
@Query("SELECT * FROM Song")
fun list(): LiveData<List<SongWithPlaylists>>
}
我知道,从 ERM 的角度来看,您将如何为这种关系建模:
/-- A ---\ /- ACrossB -\ /-- B ---\
| | | | | |
| - id |----->| - aId | |------| - id |
| - name | | - bId |-----| | -name |
| | | - prop | | |
\--------/ \-----------/ \--------/
我也知道如何使用 JOIN 查询此关系,但无法从文档中弄清楚如何在 Room 中执行此操作同时保持数据完整性。
【问题讨论】:
-
我想知道您的附加财产
rating是做什么用的?播放列表还是歌曲? -
评分是针对歌曲和播放列表的组合。一首歌在不同的播放列表中可能有不同的评分。
-
你解决了吗?我有一个类似的问题(我需要额外的属性来排序播放列表中的歌曲)
-
不,抱歉。我没有时间继续研究 Android Room。
-
@Jeremy 我的英语很差,但我在issuetracker.google.com/issues/169467510 的谷歌问题跟踪器中打开了一个问题我遇到了同样的问题,我认为唯一的解决方法是使用脏 Sqlite
标签: android kotlin android-room