我在 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/