Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 房间';s`onDelete=CASCADE`在迁移期间不工作_Android_Android Room_Android Architecture Components - Fatal编程技术网

Android 房间';s`onDelete=CASCADE`在迁移期间不工作

Android 房间';s`onDelete=CASCADE`在迁移期间不工作,android,android-room,android-architecture-components,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(
    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
}
当我运行删除所有用户表行的迁移时,pets表不受影响。这些行不会自动删除

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
工作?

正如@sergiytikhonov在他的评论中指出的那样,在迁移函数中启用外键约束没有效果。这是因为和

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

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

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

迁移块中的“PRAGMA foreign_keys=ON”似乎没有打开此模式。使用RoomDatabase,您可以在onOpen回调中设置它,但为时已晚,因为迁移块在它之前调用。使用SQLiteOpenHelper的回调调用方法setForeignKeyConstraintEnabled()是有可能的,但我不知道如何从RoomDatabase类内部调用,正如@sergiytikhonov的注释所示,在迁移函数中启用
外键
约束没有任何效果。这是因为迁移是作为事务的一部分执行的。