Android Room需要在另一个应用程序插入数据后进行迁移
我正在开发一个Android应用程序,该应用程序带有一个嵌入式SQLite数据库,运行在Android Room上。我正在将应用程序从桌面Java移动到Android,我需要将数据从桌面应用程序使用的旧数据库带入Android数据库。当我尝试在我的Android应用程序中使用修改过的数据库时,我遇到了房间问题 我尝试使用Room创建的数据库文件,并使用为此编写的一个简短Java应用程序将数据从旧数据库移动到这个数据库中。我只需清空相关表,从旧数据库读取数据并将其插入新数据库 当我尝试将数据库文件移回我的Android设备并与Android应用程序一起使用时,我遇到了以下异常: 文件室无法验证数据的完整性。看起来您已更改架构,但忘记更新版本号。 您只需增加版本号即可解决此问题 如果我在我的房间数据库代码中更改了数据库的版本,那么房间将需要一段代码进行迁移,即使数据库的结构没有更改: java.lang.IllegalStateException:需要从1迁移到2,但未找到。请通过RoomDatabase.Builder.addMigration(Migration…)提供必要的迁移路径,或允许通过RoomDatabase.Builder.fallbackToDestructiveMigration*方法之一进行破坏性迁移 我尝试清除应用程序数据缓存,清除其所有数据,甚至卸载应用程序,然后用修改后的数据库文件重新安装。并没有解决这个问题。我还尝试了这里的一切,包括在清单中设置android:allowBackup=“false”,以及将fallbackToDestructiveMigration添加到数据库中。在尝试回退破坏性迁移之后,我的新数据库的所有数据都消失了。但后来我又把修改过的数据库文件放了回去,它成功了。老实说,我不完全确定是哪一步起作用的。我认为这是在增加版本号,使用fallbackToDestructiveMigration运行它,然后在fallbackToDestructiveMigration从数据库中擦除数据时再次将新数据库文件移回Android Room需要在另一个应用程序插入数据后进行迁移,android,database-migration,android-room,Android,Database Migration,Android Room,我正在开发一个Android应用程序,该应用程序带有一个嵌入式SQLite数据库,运行在Android Room上。我正在将应用程序从桌面Java移动到Android,我需要将数据从桌面应用程序使用的旧数据库带入Android数据库。当我尝试在我的Android应用程序中使用修改过的数据库时,我遇到了房间问题 我尝试使用Room创建的数据库文件,并使用为此编写的一个简短Java应用程序将数据从旧数据库移动到这个数据库中。我只需清空相关表,从旧数据库读取数据并将其插入新数据库 当我尝试将数据库文件
我的问题是如果数据库的结构没有发生任何变化,使其与我的应用程序的实体不兼容,Room如何知道数据库已被修改?即使我已经从设备上清除了应用程序的数据,你怎么知道呢?还有,我下次应该采取哪些步骤,上面没有提到吗?我想我可以只包含迁移代码,而不做任何事情。但这似乎有点傻,我希望版本号保持在1,因为该应用目前正在开发中。添加一个空迁移
private val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
// empty migration.
}
}
if (sInstance == null) {
if (!checkDataBase())
copyDataBase(context)
synchronized(AppDatabase::class) {
sInstance = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, DATABASE_NAME)
.addMigrations(MIGRATION_1_2)
.build()
}
}
return sInstance!!
您可以从Florina Muntenescu处查看这篇文章,以了解有关迁移的更多信息