Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Room需要在另一个应用程序插入数据后进行迁移_Android_Database Migration_Android Room - Fatal编程技术网

Android Room需要在另一个应用程序插入数据后进行迁移

Android Room需要在另一个应用程序插入数据后进行迁移,android,database-migration,android-room,Android,Database Migration,Android Room,我正在开发一个Android应用程序,该应用程序带有一个嵌入式SQLite数据库,运行在Android Room上。我正在将应用程序从桌面Java移动到Android,我需要将数据从桌面应用程序使用的旧数据库带入Android数据库。当我尝试在我的Android应用程序中使用修改过的数据库时,我遇到了房间问题 我尝试使用Room创建的数据库文件,并使用为此编写的一个简短Java应用程序将数据从旧数据库移动到这个数据库中。我只需清空相关表,从旧数据库读取数据并将其插入新数据库 当我尝试将数据库文件

我正在开发一个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从数据库中擦除数据时再次将新数据库文件移回


我的问题是如果数据库的结构没有发生任何变化,使其与我的应用程序的实体不兼容,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处查看这篇文章,以了解有关迁移的更多信息