【问题标题】:Android Room Insert To Join Table Doesn't WorkAndroid房间插入加入表不起作用
【发布时间】: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


【解决方案1】:

看起来分别在插入语句之前和之后运行 db.beginTransaction() 和 db.endTransaction() 并不能很好地工作。删除它为我修复了它。

【讨论】:

  • 您在致电endTransaction() 之前是否致电setTransactionSuccessful()?如果您不这样做,那么您的事务将被回滚,并且所有更改都将被还原。有一种方便的方法RoomDatabase.runInTransaction(Runnable) 可用于将某些东西作为事务运行。您可以查看它的源代码,了解如何正确使用 Room 中的事务。
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2018-07-28
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
相关资源
最近更新 更多