【问题标题】:Room inflates database with old data房间用旧数据膨胀数据库
【发布时间】:2021-10-12 05:31:41
【问题描述】:

我正在尝试在首次加载应用程序时自动填充数据库。我正在尝试从本地副本“膨胀”数据库,如下所示:

 public static synchronized bDB getInstance(Context context) {
        if(bDB == null) {
            Log.v("Hello", "Inflating database.");
            bDB = Room.databaseBuilder(context.getApplicationContext(), BDB.class, databaseName)
                    .createFromAsset("database/bdb.db")
                    .fallbackToDestructiveMigration()
                    .build();
        }
        return bDB;
    }

我注意到初始文件中有错误(数据错误,架构保持不变)。我更正了它并更新了文件'bdb.db'。但是,每次预填充数据库时,它总是会拾取旧的错误数据。我尝试了以下方法:

  • 已清除所有缓存并使其无效。
  • 清理并重建。
  • 检查数据库文件一百万次。

虽然资产文件夹中的文件是正确的,但它从哪里获取旧数据?
欢迎任何帮助。

【问题讨论】:

  • 您使用的是什么版本的 Android Studio? Bumblebee Canary 5 存在以下问题:尽管您进行了更改,但它实际上不会在 API 29+ 设备上安装您的应用
  • 您在测试替换数据库之前是否完全卸载了应用程序?您的应用是否在清单中启用了备份?如果您使用 Room 2.3.0,您是否尝试将可选的回调参数添加到 createFromAsset() 以查看您的资产是否正在使用?您是否检查过构建的 APK 以确认 APK 中的资产有您修改后的数据?
  • 我使用的是 Android Studio 4.0。 @CommonsWare:我在测试替换数据库之前完全卸载了该应用程序。我仔细检查了手机上是否还有任何应用数据。没有。 createFromAsset() 已经存在于函数调用中。 APK 内的数据库有旧数据。我已在清单中将“allowBackup”设置为 true。你认为这就是问题所在吗?
  • @CommonsWare:我认为问题在于将allowBackup 设置为true。我把它弄错了,它起作用了。你能把那个答案写出来,我会把它标记为正确的。任何关于可能发生的事情的指示都会有所帮助。
  • “createFromAsset() 已经存在于函数调用中”——是的,我看到了。但是,我建议添加可选的回调参数。这是 Room 2.3.0 的新功能,它会让您知道您的资产是否已被使用。

标签: android android-room


【解决方案1】:

根据cmets的讨论,你好像被auto-backup咬了。使用 Room,由于架构更改,这更通常表现为 "cannot verify data integrity" 错误 - 在您的情况下,架构相同,但数据不同。

您可以配置自动备份,包括禁用它(如您所做的那样,将android:allowBackup 设置为false)或控制要备份的文件(使用android:fullBackupContent)。而且,您可以在每个构建变体的基础上执行此操作,例如为 debugrelease 构建设置不同的值:

  • 对于android:allowBackup,您应该能够指向布尔资源,在maindebug 中具有不同的值
  • 对于android:fullBackupContent,您可以在maindebug 中使用不同的规则拥有不同的XML 资源

【讨论】:

  • 非常感谢您的帮助。您的答案中有一些非常有用的指示,供我进一步研究。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
相关资源
最近更新 更多