在迁移过程中,房间的 "onDelete = CASCADE "不工作。

问题描述 投票:1回答:1

我有以下几个表。

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

即使我在迁移前执行下面的代码片段,它也没有工作。

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

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

android android-room android-architecture-components
1个回答
0
投票

正如 @sergiytikhonov 在他的评论中所指出的,在迁移函数中启用 foreign_keys 约束没有任何效果。这是因为 迁移是作为事务的一部分来执行的。语法是交易中的无操作性的。.

我看不出有什么办法可以控制和启用。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
    """)
}
© www.soinside.com 2019 - 2024. All rights reserved.