当前位置: 首页 > 知识库问答 >
问题:

Android房间被另一个app插入数据后需要迁移

乐正意智
2023-03-14

我正在开发一个Android应用程序与嵌入SQLite数据库运行与Android Room。我正在将应用程序从桌面Java转移到Android,我需要将数据从桌面应用程序使用的旧数据库带入Android数据库。当我尝试用Android应用程序使用修改过的数据库时,我遇到了一个Room问题。

我尝试清除应用程序数据缓存,清除其所有数据,甚至卸载应用程序,然后用修改后的数据库文件重新安装它。并没有让问题消失。我还尝试了所有不能验证数据完整性的方法,包括在我的清单中设置Android:AllowBackup=“false”,以及在我的数据库中添加fallbackToDestructiveMigration。在尝试fallbackToDestructiveMigration之后,我的新数据库的所有数据都消失了。但后来我把修改过的数据库文件重新放了进去,它就起作用了。老实说,我不完全确定是哪一步让它奏效的。我认为它增加了版本号,用fallbackToDestructiveMigration运行它,然后当fallbackToDestructiveMigration从数据库中删除数据时,将新的数据库文件重新移回...

我的问题是,当数据库的结构没有发生任何变化,使其与我的应用程序的实体不兼容时,Room如何知道数据库已经被修改?即使我已经从设备上清除了应用程序的数据,又怎么知道呢?还有什么我下次应该采取的步骤上面没有提到吗?我想我可以只包含什么都不做的迁移代码。但这似乎有点傻,我希望版本号停留在1,因为应用程序正在开发的时刻。

共有1个答案

唐康安
2023-03-14

添加一个空迁移。

 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的迁移指南,以了解更多关于迁移的信息

 类似资料:
  • 并且我发现了基于数据库版本4的可能场景的迁移varargs。 我的问题是,假设我使用的是db v1的Room,当我的应用程序到达db v10时,我将不得不编写多少迁移方法? 在sqlite中,我们在中获得已安装应用程序的当前db版本,我们只需通过开关大小写而不使用break语句,以便满足所有db升级。

  • 我们的应用程序有DB14版本,并使用android sqllite帮助器。现在我们正在使用房间数据库,并将所有数据库的东西迁移到房间。我们已经定义了从1_2,2_3的所有迁移。到13_14,并给出所有这些int构建 这是正确的做法吗。如果我用DB14版本安装了非房间版本的应用程序,并且我试图用相同的DB14版本更新它到房间版本的应用程序,我会得到错误: IllegalStateException:

  • 我有一个插入行的查询 我正在使用RxJava在后台线程上执行查询: 目前,它成功返回为插入的DAO新创建的主键。如何返回整个插入的行,而不使用新的行ID执行第二次查询? 在postgreql我会做这样的事情: 不知道如何使用房间图书馆

  • 我在房间使用关系中添加了一对多关系。我引用这篇文章是为了编写以下房间关系代码。 这篇文章讲述了如何从数据库中读取值,但将实体存储到数据库中会导致用户ID为空,这意味着这两个表之间没有关系。 我不确定在具有用户ID值的情况下,将用户和宠物列表插入数据库的理想方法是什么。 1)用户实体: 2) 宠物实体: 3)用户带宠物POJO: 现在,为了从DB中获取记录,我们使用以下DAO: 编辑 我已创建此问题

  • 问题内容: 我需要将数据从一个数据库迁移到另一个数据库,两者都在同一本地系统上。 表和列的名称不同,我不能从旧数据库迁移所有列,因此 对我不起作用。 但我只有一个 我的查询中有什么错误,我该如何解决? 提前致谢 问题答案: 您的查询应如下所示: 更新 由于这个答案的关注程度超出了我的预期,因此我应该扩展这个答案。首先,从答案本身看可能并不明显,但各列不必具有相同的名称。因此,以下操作也将起作用(假

  • 我用这个房间已经有一段时间了。我来自mysql的背景,您必须检查查询和其他内容的值。在room中,我发现这有点复杂,因为到目前为止,我可以将dao insert查询声明为void,或者只要返回rowId,如果返回long,我就必须编写一个侦听器来通知UI成功/失败。我的问题是,这是否必要?我是否需要insert/updates/deletes的返回值,或者这些查询是否保证成功?