【发布时间】:2020-05-28 12:40:15
【问题描述】:
我有以下表格:
@Entity(
tableName = "users"
)
class Users {
@PrimaryKey(autoGenerate = true)
var id: Long? = null
@NonNull
var name: String? = null
}
@Entity(
tableName = "pets",
foreignKeys = [
ForeignKey(
entity = Users::class,
parentColumns = ["id"],
childColumns = ["owner_id"],
onDelete = ForeignKey.CASCADE
)
]
)
class Pets {
@PrimaryKey(autoGenerate = true)
var id: Long? = null
@NonNull
var name: String? = null
@ColumnInfo(name = "owner_id")
var ownerId: Long? = null
}
当我运行删除所有用户表行的迁移时,宠物表不受影响。这些行不会自动删除。
object Migration_1_2 : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("""
DELETE FROM users
""")
}
}
即使我在迁移前执行以下 sn-p 代码,它也不起作用。
database.execSQL("PRAGMA foreign_keys=ON;");
我应该怎么做才能使onDelete = ForeignKey.CASCADE 工作?
【问题讨论】:
-
迁移块内的“PRAGMA foreign_keys=ON”似乎没有打开此模式。使用 RoomDatabase 您可以在 onOpen 回调中设置它,但为时已晚,因为迁移块在它之前调用。有一些机会使用 SQLiteOpenHelper 的回调 onConfigure 调用方法 setForeignKeyConstraintsEnabled(),但我不知道如何从 RoomDatabase 类中执行此操作
-
正如@sergiytikhonov 的评论所示,在迁移函数中启用
foreign_keys约束无效。这是因为迁移是作为事务的一部分执行的,the pragma is a no-op inside a transaction。
标签: android android-room android-architecture-components