Сбой ограничения FOREIGN KEY для Android-комнаты (код 787)
Я пытаюсь создать базу данных в Android Room с двумя внешними ключами. Каждый раз, когда я пытаюсь вставить трек в базу данных, программа вылетает и говорит, что "сбой извлечения внешнего ключа (код 787)". Может быть, кто-то из вас знает почему и может мне помочь.
@Entity(foreignKeys = {@ForeignKey(
entity = Kategorie.class,
childColumns = "kategorieFremdschluessel",
parentColumns = "kategorieID",
onUpdate = ForeignKey.CASCADE,
onDelete = ForeignKey.CASCADE
),
@ForeignKey(
entity = Playlist.class,
childColumns = "playlistFremdschluessel",
parentColumns = "uuid",
onUpdate = ForeignKey.CASCADE,
onDelete = ForeignKey.CASCADE
)
})
public class Track {
@PrimaryKey(autoGenerate = true)
private int uid;
private String trackTitel;
private String playlistName;
private String jsonObjectString;
private int kategorieFremdschluessel;
private int playlistFremdschluessel;
@Ignore
public Track(String trackTitel, String playlistName, String jsonObjectString) {
this.trackTitel = trackTitel;
this.playlistName = playlistName;
this.jsonObjectString = jsonObjectString;
}
public Track(String trackTitel, String jsonObjectString) {
this.trackTitel = trackTitel;
this.jsonObjectString = jsonObjectString;
}
//Getter and Setter
@Dao
TrackDao
public interface TrackDao {
@Query("SELECT * FROM Track WHERE playlistName LIKE :playlist")
List<Track> getAllTracks(String playlist);
@Query("SELECT * FROM Track WHERE kategorieFremdschluessel = :kategorieFremdschluessel")
List<Track> loadAllKategorieTracks(int kategorieFremdschluessel);
@Query("SELECT * FROM Track WHERE playlistFremdschluessel = :playlistFremdschluessel")
List<Track> loadAllPlaylistTracks(int playlistFremdschluessel);
@Insert
void insertAll(List<Track> trackList);
@Insert
void insertOne(Track track);
@Update
void updateOne(Track track);
@Delete
void delete(Track track);
}
"Kategorie" и "Playlist" также являются таблицами в базе данных.
@Entity
public class Playlist{
@PrimaryKey(autoGenerate = true)
private int uuid;
@ColumnInfo(name = "name")
private String name;
Kategorie
@Entity
public class Kategorie {
@PrimaryKey(autoGenerate = true)
private int kategorieID;
@ColumnInfo(name = "name")
private String name;
1 ответ
Вам нужно иметь строки в таблицах Kategorie
а также Playlist
с тем же внешним ключом, что и Track
что вы вставляете.
Есть еще одна причина, по которой возникает эта ошибка, которая отнимала у меня много времени, поскольку каждое возможное решение, доступное в Интернете, казалось бесполезным в моем случае.
Если вы используете rowId родительской таблицы в качестве ключа parentColumn, ограничение внешнего ключа НЕ МОЖЕТ использоваться.
Согласно документации SQLite по внешним ключам:
Родительский ключ - это столбец или набор столбцов в родительской таблице, на который ссылается ограничение внешнего ключа. Это обычно, но не всегда, первичный ключ родительской таблицы. Родительский ключ должен быть именованным столбцом или столбцами в родительской таблице, а не rowid.