Nav*_*jan 4 android kotlin android-room androidx
我是 android 房间图书馆的新手。我需要将 Not Null 列迁移到 Null,但房间迁移只允许在 ALTER 表查询中添加或重命名。如何执行列迁移查询?
@Entity(tableName = "vehicle_detail")
data class VehicleDetailsEntity(
@PrimaryKey(autoGenerate = true)
val vehicleClientId: Long = 0,
val vehicleId: String,
val updatedOn: Date,
val updatedBy: String
)
Run Code Online (Sandbox Code Playgroud)
我需要将表结构更改为
@Entity(tableName = "vehicle_detail")
data class VehicleDetailsEntity(
@PrimaryKey(autoGenerate = true)
val vehicleClientId: Long = 0,
val vehicleId: String,
val updatedOn: Date?,
val updatedBy: String?
)
Run Code Online (Sandbox Code Playgroud)
java.lang.IllegalStateException: Room 无法验证数据完整性。看起来您已更改架构但忘记更新版本号。您可以通过增加版本号来简单地解决此问题。
axi*_*tjz 14
您需要运行迁移,因为 SQLite 不允许修改列约束。
对于该迁移,您需要创建一个新的临时表并将所有以前的数据复制到其中,然后删除旧表并将临时表重命名为所需的表名。
如果您有一个方案目录,您可以找到您应该在迁移时复制的确切创建 SQL 查询(我只是从我的方案中找出来的,并且不可能 100% 正确):
val MIGRATION_1_2: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
// Create the new table
database.execSQL(
"CREATE TABLE IF NOT EXISTS VehicleDetailsEntityTmp (vehicleId TEXT NOT NULL, updatedOn TEXT, updatedBy TEXT,vehicleClientId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL )"
)
// Copy the data
database.execSQL(
"INSERT INTO VehicleDetailsEntityTmp (vehicleId, updatedOn, updatedBy ,vehicleClientId) SELECT vehicleId, updatedOn, updatedBy ,vehicleClientId FROM VehicleDetailsEntity ")
// Remove the old table
database.execSQL("DROP TABLE VehicleDetailsEntity")
// Change the table name to the correct one
database.execSQL("ALTER TABLE VehicleDetailsEntityTmp RENAME TO VehicleDetailsEntity")
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2762 次 |
最近记录: |