如何强制 Android 虚拟设备忘记我的应用程序的数据库版本

问题描述

我有一个带有预填充数据库的应用程序(我使用 Room、Kotlin)。数据库类:

@Database(
    entities = [FurnitureModel::class,ImageModel::class],version = Database.VERSION,exportSchema = true
)
abstract class Database : RoomDatabase() {
    abstract val furnitureDao: FurnitureDao
    abstract val imageDao: ImageDao

    companion object {
        const val NAME = "application-data"
        const val VERSION = 3

        @Volatile
        private var instance: Database? = null

        fun getInstance(context: Context): Database {
            synchronized(this) {
                var inst = instance

                if (inst == null) {
                    inst = Room.databaseBuilder(
                        context.applicationContext,Database::class.java,"$NAME-local.db"
                    )
                        .fallbackToDestructiveMigration()
                        .createFromAsset("$NAME.db")
                        .build()
                    instance = inst
                }

                return inst
            }
        }
    }
}

效果很好。一旦我决定更新数据库中的一些数据。没有结构变化,只是添加和更改一些数据。对于版本,我将常量 VERSION 从 3 更改为 4。当我运行应用程序时,我的数据库为空。据我了解,在少数情况下可以使用 fallbackToDestructiveMigration 获得空数据库。我可能在数据的某个地方犯了一些错误。为了获得更多详细信息,我决定在没有预装以前版本的情况下运行应用程序。干净安装,如果我可以这样说。为此,我在 AVD 管理器中擦除了虚拟设备的数据,删除了应用程序和应用程序目录中的构建目录,并在 Android Studio 中运行“无效缓存/重启...”(我知道没有必要这样做)。但结果总是一样:尝试安装我的应用程序时总是出错

Caused by: java.lang.IllegalStateException: A migration from 3 to 4 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.

据我所知,第一次安装应用程序时一定不会显示错误。但是显示出来了。我试图创建新的虚拟设备并在那里运行应用程序,但错误仍然存​​在。 我该怎么做才能让 Android Studio 忘记之前安装过该应用程序? 谢谢。

UPD1:我不需要保留任何数据,实际上我想删除以前版本应用程序中的所有数据。但是在擦除数据后它仍然可以工作,就好像我没有擦除它一样。这就是问题所在。

结果:我发现问题出在预填充的数据库中。不幸的是,我无法发现数据库完全错误。我禁用了从资产创建数据库,运行应用程序,以便 Room 创建空数据库,从模拟器复制数据库并将每个表与我的数据库进行比较。没有任何区别。所以为了解决这个问题,我只是将每个表中的所有数据移动到新的空数据库中的同一个表中(使用 DataGrid)。运行应用程序新数据库后,问题消失了。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...