Сбой ограничения FOREIGN KEY для Android-комнаты (код 787) - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь создать базу данных в 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;

Категория

@Entity
public class Kategorie {



@PrimaryKey(autoGenerate = true)
private int kategorieID;


@ColumnInfo(name = "name")
private String name;

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Есть еще одна причина, по которой возникает эта ошибка, которая отнимает у меня много времени, поскольку каждое возможное решение, доступное в Интернете, в моем случае казалось бесполезным.

Если вы используете rowId родительской таблицы как ключ parentColumn , ограничение внешнего ключа НЕ МОЖЕТ использоваться.

Согласно документации SQLite по внешним ключам :

Родительский ключ - это столбец или набор столбцов в родительской таблице, на который ссылается ограничение внешнего ключа.Это обычно, но не всегда, первичный ключ родительской таблицы.Родительский ключ должен быть именованным столбцом или столбцами в родительской таблице, , а не rowid.

0 голосов
/ 07 июня 2018

Вам нужно иметь строки в таблицах Kategorie и Playlist с тем же внешним ключом , что и Track, который вы вставляете.

...