Android 如何更改表并添加onDelete级联约束sqlite
我正在使用房间数据库我有一个表,我忘记在其中添加Android 如何更改表并添加onDelete级联约束sqlite,android,sqlite,android-room,Android,Sqlite,Android Room,我正在使用房间数据库我有一个表,我忘记在其中添加onDelete=CASCADE 以前的版本 @Entity(Index={@Index(value={“info\u id”}),ForeignKey=@ForeignKey(Entity=StudentClass.class,parentColumns=“id”,childColumns=“info\u id”)) 我现在想要什么 @Entity(Index={@Index(value={“info\u id”}),ForeignKey=@Fo
onDelete=CASCADE
以前的版本
@Entity(Index={@Index(value={“info\u id”}),ForeignKey=@ForeignKey(Entity=StudentClass.class,parentColumns=“id”,childColumns=“info\u id”))
我现在想要什么
@Entity(Index={@Index(value={“info\u id”}),ForeignKey=@ForeignKey(Entity=StudentClass.class,parentColumns=“id”,childColumns=“info\u id”,onDelete=CASCADE))
我正在尝试迁移数据库
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("What should I do here to add onDelete = CASCADE");
}
};
好的,我终于找到了解决办法
database.execSQL("CREATE TABLE attendance_temp(attendanceId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, time INTEGER NOT NULL, student_id INTEGER, student_name TEXT , roll_number INTEGER, image_path TEXT, info_id INTEGER, present INTEGER , CONSTRAINT fk_class_info FOREIGN KEY (info_id) REFERENCES class_info(id) ON DELETE CASCADE)");
database.execSQL("INSERT INTO attendance_temp SELECT * FROM Attendance");
database.execSQL("DROP TABLE Attendance");
database.execSQL("ALTER TABLE attendance_temp RENAME TO Attendance");
database.execSQL("CREATE INDEX index_Attendance_info_id ON Attendance(info_id)");
还要将实体类中的架构更改为
@Entity(indices = {@Index(value = {"info_id"})}, foreignKeys = @ForeignKey(entity = StudentClass.class, parentColumns = "id", childColumns = "info_id", onDelete = CASCADE))
顺序很重要。SQLite不完全支持SQL ALTER TABLE标准: 仅“重命名表”、“添加列”和“重命名列”变量 支持ALTERTABLE命令。其他类型的表格 诸如删除列、更改列、添加约束等操作 第四部分省略 因此,添加约束的唯一方法是重新创建表并将旧表的数据复制到新表:
// 1. Rename your table
database.execSQL("ALTER TABLE Entity RENAME TO Entity_old")
// 2. Recreate the same entity, but now with the constraint
database.execSQL("""
CREATE TABLE Entity(
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
parentId INTEGER,
someField STRING,
CONSTRAINT fk_Entity_entityId_EntityParent_id FOREIGN KEY (entityId) REFERENCES EntityParent(id) ON DELETE CASCADE
)
""")
// 3. Copy the data from the old table
database.execSQL("INSERT INTO Entity SELECT * FROM Entity_old")
// 4. Delete old table
database.execSQL("DROP TABLE Entity_old")
// 5. Recreate the indices
database.execSQL("CREATE INDEX index_Entity_id ON Entity(id)")
哇,那真是太痛苦了:(