android - onDelete = NO_ACTION 导致错误 : "SQLiteConstraintException: FOREIGN KEY constraint failed" (code 787)

标签 android sqlite android-sqlite android-room android-database

我在 Android 版 SQLite 之上使用 Room,并且有以下两个 Pojo 实体:

@Entity
public class Event {
    @PrimaryKey
    @NonNull
    private String eventId;
    private String eventName;
}

@Entity(primaryKeys = {"eventId","attendeeId"},
        foreignKeys = {
                @ForeignKey(entity = Event.class,
                        parentColumns = "eventId",
                        childColumns = "eventId" ,onDelete = NO_ACTION)
        })
public class Attendee {
    @NonNull
    private String eventId;
    @NonNull
    private String attendeeId;
}

当我尝试从事件表中删除记录时,出现以下错误:

Caused by: android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787) at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:732)
        at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
        at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
        at android.arch.persistence.db.framework.FrameworkSQLiteStatement.executeUpdateDelete(FrameworkSQLiteStatement.java:45)
        at com.minapharm.hixspro.POJO.Room.Events.EventDao_Impl.deleteTable(EventDao_Impl.java:168)

但是,如果我将 onDelete 更改为 CASCADE,则不会出现问题!

我错过了什么吗?

最佳答案

如果您会看到here .

By default, NO_ACTION is used.

您不需要明确提供它。

@Entity(primaryKeys = {"eventId","attendeeId"},
        foreignKeys = {
                @ForeignKey(entity = Event.class,
                        parentColumns = "eventId",
                        childColumns = "eventId")
        })
public class Attendee {
    @NonNull
    private String eventId;
    @NonNull
    private String attendeeId;
}

此外,您需要了解数据库创建一次。您应该重新安装该应用程序,然后检查删除是否有效。

已编辑:由于您已定义外键但未定义 onDelete CASCADE,因此您必须从参加者中手动删除所有指向您要删除的事件表行的条目。

关于android - onDelete = NO_ACTION 导致错误 : "SQLiteConstraintException: FOREIGN KEY constraint failed" (code 787),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56787511/

相关文章:

android - ConstraintSet 中 clone() 的不同实现有什么区别?

php不向mysql插入json数据

android - 房间数据库迁移

java - 带偏移量的 android sqlite 查询不返回所需的行

android - 膨胀包含自己的 View 的自定义 View 时出现 StackOverflowError

Android如何获取以编程方式使用whats app应用程序的联系人列表

android:使用内置的 pdf 查看器从我的应用程序中打开一个 pdf

python - Pandas 数据框进入数据库,类型错误: Required argument 'database' (pos 1) not found

android - android 数据库的大小会影响设备的电池效率吗?

android - 每个 Activity 开始后显示 SQLiteConstraintException 错误