首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >客房db迁移fallbackToDestructiveMigration()不工作

客房db迁移fallbackToDestructiveMigration()不工作
EN

Stack Overflow用户
提问于 2021-09-26 00:50:47
回答 4查看 2.5K关注 0票数 4

我使用的是“资产”文件夹中预编好的数据库的Room。对于应用程序更新,我想通过添加一个新的列并用新的数据预先填充这个列来修改这个数据库。

数据库是从版本1自动迁移到2(添加了一个表)。从第2版到第3版,我现在想通过在资产文件夹中提供一个不同的“database.db”文件并允许破坏性迁移来应用上述更改。

代码语言:javascript
运行
复制
@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()
        }
    }
}

问题是,我仍然得到以下例外:

代码语言:javascript
运行
复制
   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“。

有什么想法吗?

EN

Stack Overflow用户

发布于 2021-09-26 01:16:33

深入研究房间文档并没有多大帮助,我的预感是,这与您使用Automigrations而不是实现的迁移有关。您是否尝试过将自动迁移从1->2更改为已实现的迁移?

另外,由于您正在用一个预先填充数据的新数据库手动替换它,所以我的解决方案是去掉旧的迁移,稍微更改DB的名称,然后从版本1开始。如果有人从旧版本迁移到当前版本,那么就没有理由维护旧迁移了。

票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69331044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档