我使用的是“资产”文件夹中预编好的数据库的Room。对于应用程序更新,我想通过添加一个新的列并用新的数据预先填充这个列来修改这个数据库。
数据库是从版本1自动迁移到2(添加了一个表)。从第2版到第3版,我现在想通过在资产文件夹中提供一个不同的“database.db”文件并允许破坏性迁移来应用上述更改。
@Database(entities = [Object1::class, Object2::class], version = 3, autoMigrations = [
AutoMigration (from = 1, to = 2)], exportSchema = true)
abstract class AppDatabase : RoomDatabase() {
abstract fun dao(): Dao
companion object {
private const val DB_NAME = "database.db"
@Volatile
private var instance: AppDatabase? = null
fun getInstance(context: Context): AppDatabase {
return instance ?: synchronized(this) {
instance ?: buildDatabase(context).also { instance = it }
}
}
private fun buildDatabase(context: Context): AppDatabase {
return Room.databaseBuilder(
context,
AppDatabase::class.java, "AppDB.db")
.fallbackToDestructiveMigration()
.createFromAsset(DB_NAME)
.build()
}
}
}
问题是,我仍然得到以下例外:
java.lang.IllegalStateException: A migration from 1 to 3 was required but not found. Please provide the necessary Migration path via RoomDatabase.Builder.addMigration(Migration ...) or allow for destructive migrations via one of the RoomDatabase.Builder.fallbackToDestructiveMigration* methods.
我不知道为什么还会发生这种情况。我认为这要么是提供迁移脚本,要么是允许破坏性迁移,从而使迁移工作。
添加了评论:-
我尝试过一个已实现的迁移,但同样的异常再次发生。当我尝试重新开始使用versionCode 1时,我得到的是"java.lang.IllegalStateException: Room无法验证数据完整性。看起来您已经更改了模式,但忘记了更新版本号。您可以通过增加版本号来修复这个问题。“我还更改了数据库名,并在清单中添加了android:allowBackup="false“。
有什么想法吗?
发布于 2021-09-26 01:16:33
深入研究房间文档并没有多大帮助,我的预感是,这与您使用Automigrations而不是实现的迁移有关。您是否尝试过将自动迁移从1->2更改为已实现的迁移?
另外,由于您正在用一个预先填充数据的新数据库手动替换它,所以我的解决方案是去掉旧的迁移,稍微更改DB的名称,然后从版本1开始。如果有人从旧版本迁移到当前版本,那么就没有理由维护旧迁移了。
https://stackoverflow.com/questions/69331044
复制相似问题