Java Android room外键约束失败,即使值相同
android上的ROOM数据库拒绝使用外键正常工作,并且无论我如何尝试修复它,总是会出错 我正在尝试将播放列表存储到房间数据库中。因此playlidb包含与播放列表关联的唱片集艺术、名称和id。Songsdb包含有关歌曲的所有信息(URI、专辑艺术、标题、艺术家和播放列表_id(外键)) 忽略凌乱的WIP代码,但我已尝试以下方法来修复标题中描述的问题:Java Android room外键约束失败,即使值相同,java,android,sqlite,android-room,Java,Android,Sqlite,Android Room,android上的ROOM数据库拒绝使用外键正常工作,并且无论我如何尝试修复它,总是会出错 我正在尝试将播放列表存储到房间数据库中。因此playlidb包含与播放列表关联的唱片集艺术、名称和id。Songsdb包含有关歌曲的所有信息(URI、专辑艺术、标题、艺术家和播放列表_id(外键)) 忽略凌乱的WIP代码,但我已尝试以下方法来修复标题中描述的问题: 创建单独的键而不使用父表的自动生成主键 硬编码值 添加日志条目以获取我要插入到数据库中的值 但是没有用 问题在于在下面的insertPlayl
public static void insertPlaylist(Context context, Playlists playlist, SongData[] songs){
SongsDB songsDB;
PlaylistsDB playlistsDB;
songsDB = SongsDB.getInstance(context);
playlistsDB = PlaylistsDB.getInstance(context);
int index = 0;
//insert playlists first
//get index from playlists so we can increment the value here to give it a unique value.
index = playlistsDB.playlistsDao().queryLastInsert();
//increment index
index++;
playlist.setPlaylistID(index);
playlistsDB.playlistsDao().insertPlaylist(playlist);
//log for sanity check
Log.e("tesststaAETAST:", Integer.toString(playlistsDB.playlistsDao().queryLastInsert()));
Log.e("INDEX:", Integer.toString(index));
//then insert songs
for(int i =0; i < songs.length; i++)
{
Songs song = new Songs(0,songs[i].getSongId(),songs[i].getTitle(),songs[i].getAlbum(),songs[i].getArtist(),songs[i].getAlbumArt().toString(),songs[i].getDuration(), index);
songsDB.songsDao().insertPlaylist(song);
}
SongsDB.destroyInstance();
PlaylistsDB.destroyInstance();
}
松岛:
@Dao
public interface SongsDao {
@Query("SELECT playlist_id from songs")
Cursor queryPlaylists();
@Query("SELECT * from Songs WHERE playlist_id like :playlistID")
Cursor querySongsFromPlaylist(int playlistID);
@Insert()
void insertPlaylist(Songs songs);
@Update()
void updatePlaylist(Songs songs);
@Delete()
void deletePlaylist(Songs songs);
@Query("DELETE FROM Songs")
void resetPlaylist();
}
从日志输出中可以看到,插入到索引中的值(对应于playlist_id)与我刚刚从数据库查询到的值完全相同
2019-10-03 18:58:59.538 16084-16084/com.lucas.darkplayer E/tesststaAETAST:: 3
2019-10-03 18:58:59.538 16084-16084/com.lucas.darkplayer E/INDEX:: 3
您所做的一切似乎都很正常,但是您不应该为
播放列表
和歌曲
设置两个单独的数据库。相反,您应该只有一个包含两个表(实体)的数据库,它们应该通过外键约束相互关联
我发现的另一件事是,在播放列表
实体中有两列似乎具有相同的用途:索引(定义为自动生成的主键)和id
。我不知道您为什么这样做,但我认为您应该只拥有一个名为id
的列,并将该字段设置为您的主键
此外,如果将PrimaryKey定义为autogenerate=true
,则无需担心生成唯一的id值。相反,当您第一次在数据库中保存实体实例时,数据库将自动为您处理该问题。我之所以这样做,是因为我试图查看是否以某种方式使用主键作为外键导致了我的问题。但是谢谢你的反馈!我仍然不知道为什么它会抛出外键约束错误。@LLJY因为播放列表保存在一个数据库中,而歌曲保存在另一个数据库中。因此,当您想要保存歌曲时,会出现错误,因为它找不到播放列表(它不在同一个db中),因此外键约束失败。您应该只有一个数据库,并且两个实体都在同一个数据库中。这就是为什么你会出错。让我知道我是否可以进一步帮助你:)让我知道,一旦你做了必要的更改,只有一个数据库开始工作或没有
2019-10-03 18:58:59.538 16084-16084/com.lucas.darkplayer E/tesststaAETAST:: 3
2019-10-03 18:58:59.538 16084-16084/com.lucas.darkplayer E/INDEX:: 3
@Dao
public interface SongsDao {
@Query("SELECT playlist_id from songs")
Cursor queryPlaylists();
@Query("SELECT * from Songs WHERE playlist_id like :playlistID")
Cursor querySongsFromPlaylist(int playlistID);
@Insert()
void insertPlaylist(Songs songs);
@Update()
void updatePlaylist(Songs songs);
@Delete()
void deletePlaylist(Songs songs);
@Query("DELETE FROM Songs")
void resetPlaylist();
}
2019-10-03 18:58:59.538 16084-16084/com.lucas.darkplayer E/tesststaAETAST:: 3
2019-10-03 18:58:59.538 16084-16084/com.lucas.darkplayer E/INDEX:: 3