android - 房间的 `onDelete = CASCADE` 在迁移期间不工作

标签 android android-room android-architecture-components

我有以下表格:

@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
        """)
    }
}

即使我在迁移之前执行以下代码 fragment ,它也不起作用。

database.execSQL("PRAGMA foreign_keys=ON;");

我应该怎么做才能使 onDelete = ForeignKey.CASCADE 正常工作?

最佳答案

正如@sergiytikhonov 在他的评论中指出的那样,在迁移函数中启用 foreign_keys 约束没有任何效果。这是因为 migrations are executed as part of a transactionthe pragma is a no-op inside a transaction .

在执行迁移之前,我看不到有任何方法可以控制和启用 foreign_keys。我认为您唯一的选择是在迁移过程中明确删除宠物:

override fun migrate(database: SupportSQLiteDatabase) {
    database.execSQL("""
        DELETE FROM pets WHERE owner_id IN (SELECT id FROM users)
    """)

    database.execSQL("""
        DELETE FROM users
    """)
}

关于android - 房间的 `onDelete = CASCADE` 在迁移期间不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62064932/

相关文章:

android - 在 Android BLE 中使用自定义 UUID 时遇到问题

javascript - Cordova 为 Android 构建错误所以我无法构建我的解决方案

java - 每次应用程序打开Android时如何执行代码

android - 在 Android Room 中使用 @Upsert 时获取 "UNIQUE constraint failed"

android - achartengine 散点图点大小

Android Room 将 Null 作为 Non-Null 类型返回

android - 如何避免房间外键错误 - 约束失败(代码 787)

android - 带有自定义数据源的分页库在房间更新时不更新行

java - 如何在更改全屏/底部导航时使用导航组件 navhostfragment

android - LiveData 防止在开始观察时收到最后一个值