【问题标题】:Room's `onDelete = CASCADE` not working during a migrationRoom 的 `onDelete = CASCADE` 在迁移期间不起作用
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-03-25
    • 2014-09-13
    • 2019-02-18
    • 1970-01-01
    • 2015-03-25
    • 2012-01-23
    • 2020-10-08
    • 2023-03-28
    相关资源
    最近更新 更多