【发布时间】:2018-10-31 21:47:56
【问题描述】:
我环顾四周,找不到任何解释为什么会发生这种情况。 我尝试在 sqliteman 之类的应用程序中打开我的 db 文件并自己运行“INSERT INTO”查询,这样就可以正常工作。然而,无论 Room 做什么似乎都没有工作,它没有崩溃或任何事情,它只是没有插入任何东西。
所以基本上我有 2 个表通过连接表以 m-n 关系连接:
1) 歌表
@Entity(tableName = RoomDbConstants.TABLE_NAME_SONGS,
foreignKeys = [ForeignKey(entity = Album::class,
parentColumns = [RoomDbConstants.COLUMN_ALBUM_ARTIST_NAME, RoomDbConstants.COLUMN_ALBUM_NAME],
childColumns = [RoomDbConstants.COLUMN_SONG_ARTIST_NAME, RoomDbConstants.COLUMN_SONG_ALBUM_NAME],
onDelete = ForeignKey.CASCADE),
ForeignKey(entity = Genre::class,
parentColumns = [RoomDbConstants.COLUMN_GENRE_NAME],
childColumns = [RoomDbConstants.COLUMN_SONG_GENRE_NAME],
onDelete = ForeignKey.CASCADE)])
data class Song(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_ID)
val id: Long?,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_DATA)
val songData: String,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_NAME)
val name: String,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_ALBUM_NAME)
val albumName: String,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_ARTIST_NAME)
val artistName: String,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_GENRE_NAME)
val genreName: String,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_TRACK_NUMBER)
val trackNumber: Int = RoomDbConstants.TRACK_NUMBER_DEFAULT,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_YEAR_PUBLISHED)
val yearPublished: Int = RoomDbConstants.YEAR_PUBLISHED_NONE,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_START_TIME_IN_MILLIS)
val startTimeInMillis: Int,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_END_TIME_IN_MILLIS)
val endTimeInMillis: Int,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_DURATION_IN_MILLIS)
val durationInMillis: Int,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONG_COVER_DATA)
val coverData: String?)
2) 播放列表表
@Entity(tableName = RoomDbConstants.TABLE_NAME_PLAYLISTS,
indices = [Index(value = [RoomDbConstants.COLUMN_PLAYLIST_NAME], unique = true)])
data class Playlist(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = RoomDbConstants.COLUMN_PLAYLIST_ID)
val id: Long?,
@ColumnInfo(name = RoomDbConstants.COLUMN_PLAYLIST_NAME)
val name: String,
@ColumnInfo(name = RoomDbConstants.COLUMN_PLAYLIST_COVER_DATA)
val coverData: String?)
3) SongsPlaylistsLink(连接歌曲和播放列表的表格)
@Entity(tableName = RoomDbConstants.TABLE_NAME_SONGS_PLAYLISTS_LINKS,
primaryKeys = [RoomDbConstants.COLUMN_SONGS_PLAYLISTS_LINK_SONG_ID,
RoomDbConstants.COLUMN_SONGS_PLAYLISTS_LINK_PLAYLIST_ID],
foreignKeys = [ForeignKey(entity = Song::class,
parentColumns = [RoomDbConstants.COLUMN_SONG_ID],
childColumns = [RoomDbConstants.COLUMN_SONGS_PLAYLISTS_LINK_SONG_ID],
onDelete = ForeignKey.CASCADE),
ForeignKey(entity = Playlist::class,
parentColumns = [RoomDbConstants.COLUMN_PLAYLIST_ID],
childColumns = [RoomDbConstants.COLUMN_SONGS_PLAYLISTS_LINK_PLAYLIST_ID],
onDelete = ForeignKey.CASCADE)],
indices = [Index(value = [RoomDbConstants.COLUMN_SONGS_PLAYLISTS_LINK_SONG_ID,
RoomDbConstants.COLUMN_SONGS_PLAYLISTS_LINK_PLAYLIST_ID], unique = true)])
data class SongsPlaylistsLink(
@ColumnInfo(name = RoomDbConstants.COLUMN_SONGS_PLAYLISTS_LINK_SONG_ID)
val songId: Long,
@ColumnInfo(name = RoomDbConstants.COLUMN_SONGS_PLAYLISTS_LINK_PLAYLIST_ID)
val playlistId: Long)
插入函数:
@Insert
fun insert(songsPlaylistsLink: SongsPlaylistsLink)
这就是我尝试做的事情: 我已经在数据库中有歌曲和播放列表。 假设我有一首 ID 为 1 的歌曲和一个 ID 为 1 的播放列表。 当我插入(SongsPlaylistsLink(1,1))时,什么也没有发生。 桌子还是空的。
任何关于为什么会发生这种情况的帮助将不胜感激!
【问题讨论】:
-
您是否查看过 Room 为您的 DAO 生成的实际代码?
-
是的,我没有发现任何问题。下面是插入函数的查询:“INSERT OR IGNORE INTO
SONGS_PLAYLISTS_LINKS(SONGS_PLAYLISTS_LINK_SONG_ID,SONGS_PLAYLISTS_LINK_PLAYLIST_ID) VALUES (?,?)” -
因此,如果出现 SQL 错误,它将被忽略。尝试使用
OnConflictStrategy.FAIL并查看错误是否会传播。此外,您可以尝试调试以查看在执行此调用期间会发生什么。 -
我尝试使用 FAIL 仍然没有。我尝试调试,但正如我所说,代码执行但没有任何反应。
标签: android database sqlite kotlin