1

我想用两个外键在 Android Room 中创建一个数据库。每次我尝试将曲目插入数据库时​​,程序都会崩溃并说“外键 costraint 失败(代码 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

追踪道

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);
}

“类别”和“播放列表”也是数据库中的表。

@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;
4

2 回答 2

4

这个错误的发生还有另一个原因,它消耗了我很多时间,因为互联网上所有可能的解决方案在我的情况下似乎都是徒劳的。

如果使用父表的rowId作为parentColumn 键,则不能使用外键约束。

根据关于外键的 SQLite 文档

父键是外键约束引用的父表中的列或列集。这通常是父表的主键,但并非总是如此。父键必须是父表中的一个或多个命名列,而不是 rowid。

于 2019-04-26T00:22:49.493 回答
3

您需要在表中有行Kategorie并且具有与您插入Playlist的相同的外键。Track

于 2018-06-06T21:58:53.093 回答