问题描述
我有一个带有预填充数据库的应用程序(我使用 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 (将#修改为@)