gpt4 book ai didi

java - 如何将数据插入多对多表-Room(Sql)Android

转载 作者:行者123 更新时间:2023-12-02 13:16:21 26 4
gpt4 key购买 nike

我创建了这个表,但是我不知道如何将数据添加到playListWithSongs表中。

@Entity
data class SongEntity(
var songId : Long? = null,
var name: String? = null,
)

@Entity
data class playlistEntity(
var playListId : Long? = null,
var playlistName: String? = null
)
@Entity
data class playListWithSongs(
var playlistId: Long,
var songId: Long
)
在这里,如何将id插入到playListWithSongs表中?
但就我而言,播放列表可能有相同的歌曲或没有歌曲。甚至歌曲也将出现在一个播放列表中,没有播放列表或多个播放列表中,因此如何插入PlayListWithSongs实体。由于这两个ID都是主键,而且我的播放列表中的歌曲数为零,因此它将为null并包含重复项(此处的歌曲列表和类(class)列表不相似)
@Insert
fun insert(playListSong: playListWithSongs)

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertPlayList(playList: PlayListEntity?)

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertCourse(song: SongsEntity?)

@Transaction
@Query("SELECT * FROM playListEntity")
fun getAll(): LiveData<List<PlayListWithSong>>

最佳答案

如果您在所有Long类中将插入函数的返回类型定义为dao,则将能够获取插入项的ID,然后使用该ID插入PlayListWithSongs。例如:

@Dao
interface SongDao {

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(entity: Song): Long
}
更新:
请注意, SongPlaylist是两个不同的实体。因此,当您想将 Song分配给 Playlist(这意味着在 playListWithSongs中添加包含其ID的新行)时,目标歌曲和播放列表应存在于db中。
我的意思是您永远不会尝试将歌曲添加到尚不存在的播放列表中。因此,在创建播放列表的第一刻,没有分配歌曲。这意味着 playListWithSongs表中没有包含新创建的 playlistId的行。
综上所述,很明显,当您要将歌曲分配到播放列表时,您应该同时拥有两个ID。另外,最好不要将此对用作 playListWithSongs的主键。让我们看看我针对该主题的书面代码:
@Entity(
tableName = "playListWithSongs",
foreignKeys = [
ForeignKey(
entity = Song::class,
parentColumns = ["songId"],
childColumns = ["songId"],
onDelete = CASCADE
),
ForeignKey(
entity = Playlist::class,
parentColumns = ["playlistId"],
childColumns = ["playlistId"],
onDelete = CASCADE
)
],
indices = [
Index(
value = ["songId", "playlistId"],
unique = true
)
]
)
data class PlayListWithSongs(
@PrimaryKey(autoGenerate = true) val id: Int? = null,
@ColumnInfo(name = "songId") val songId: Long,
@ColumnInfo(name = "playlistId") val playlistId: Long
)
如您在上面的代码中看到的,如果歌曲或播放列表被删除,那么它在 playListWithSongs上的所有分配也将被删除(由于 CASCADE)。因此,无需担心未使用的行和重复(请注意,songId和playlistId的组合定义为唯一)。

关于java - 如何将数据插入多对多表-Room(Sql)Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63845814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com