微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过重新安装应用程序使房间数据库保持不变?

如何解决如何通过重新安装应用程序使房间数据库保持不变?

我正在尝试让我的房间数据库在重新安装和使用新手机后保持不变。我目前正在使用键值备份,使用这个简单的代码

class AppBackupAgentHelper: BackupAgentHelper() {
override fun onCreate() {
    addHelper("MyDatabase",DatabaseBackupAgentHelper(
            this,"MyDatabase"
        )
    )
}

class DatabaseBackupAgentHelper(context: Context,dbname:String): FileBackupHelper(context,context.getDatabasePath(dbname).absolutePath)

我的清单有 fullBackupContent = true 和 allowBackup =true 和 android:backupAgent="com.example.myapplication3.BackupClasses.AppBackupAgentHelper"

在应用程序中,我在保存应用程序数据时在某些时候调用 datachanged。然后我使用 adb 来运行备份管理器,同时测试了 adb shell bmgr backupNow 和 adb bmgr run。执行 adb bmgr run 让我空白,但在我的应用程序中调用 onBackup 方法。做备份现在给了我:

为 1 个请求的包运行增量备份。 打包@pm@ 结果:成功 包 com.example.myapplication3 结果:成功 备份完成,结果:成功

当我重新安装应用程序时它不会恢复,当我使用令牌和包名称并在 adb 中强制恢复时它也不会恢复,而是给了我:

/adb shell bmgr restore current token package name
Scheduling restore: Google Pixel 2
restoreStarting: 0 packages
restoreFinished: 0
done

我觉得 restoreStarting: 0 包中的错误一定很明显,但我在网上找不到任何暗示可以解决此问题或我的代码哪里出错的信息。

当我尝试将应用程序放在另一部手机上时,数据库也没有被恢复。

如果您需要更多信息,请告诉我,

感谢您的帮助

编辑:

我设法让它显示 restoreStarting 1 restoreFinishing 0. 日志显示

2021-01-07 15:20:23.375 1393-3162/? D/backupmanagerService: initiateOneRestore packageName=@pm@
2021-01-07 15:20:23.411 1393-3162/? V/backupmanagerService: No more packages; finishing restore
2021-01-07 15:20:23.413 1393-3162/? I/BackupRestoreController: restoreFinished for 0

并且在恢复时我的应用没有调用

编辑 2:

因为我在谷歌驱动器上找不到数据,所以一开始似乎还没有上传数据。这是为我的应用运行的备份管理器的日志。

2021-01-08 00:54:26.279 1393-15498/? D/backupmanagerService: [UserID:0] awaiting agent for ApplicationInfo{e23f643 com.example.myapplication3}
2021-01-08 00:54:26.293 1393-3923/? D/backupmanagerService: [UserID:0] agentConnected pkg=com.example.myapplication3 agent=android.os.BinderProxy@f2665f9
2021-01-08 00:54:26.293 1393-15498/? I/backupmanagerService: [UserID:0] got agent android.app.IBackupAgent$Stub$Proxy@e01793e
2021-01-08 00:54:26.294 1393-15498/? D/keyvalueBackupTask: Invoking agent on com.example.myapplication3
2021-01-08 00:54:26.299 32291-32458/? I/Backup: [CryptoEnableCheck] Should not encrypt backups: user not opted in.
2021-01-08 00:54:26.303 14524-14543/com.example.myapplication3 D/BackupHelperdispatcher: handling existing helper 'StoryDatabase' com.example.myapplication3.BackupClasses.DatabaseBackupAgentHelper@afc78a9
2021-01-08 00:54:26.320 1393-15498/? I/BackupRestoreController: Getting widget state for user: 0
2021-01-08 00:54:26.320 1393-15498/? V/backupmanagerConstants: getBackupFinishednotificationReceivers(...) returns 

编辑 3:

我从这篇文章中使用了 pjv 的回答 - Android backup/restore: how to backup an internal database?

这肯定会在谷歌驱动器上创建我的数据库文件的备份,但该文件仍未恢复。

编辑 4:

事实证明这仅适用于模拟器...数据仍未上传到我实际物理像素 2 上的谷歌驱动器。我还向 onRestore 和 onBackup 添加了同步,但这并没有改变任何东西。日志显示正在调用 onRestore 方法

这篇文章 Remove room database on app uninstall 证明这是可能的。我已经转向使用自动备份删除备份代理)并且它有效!现在将尝试使 kv 版本工作。仍然无法在物理设备上工作。

编辑 5:

删除我的云备份并重新启动它使我的备份在我的物理设备上工作。自动备份允许房间数据库从 android 23 开始通过重新安装保持不变。我仍在努力使键值备份适用于 23 以下的 android 版本。

解决方法

您有两个选择:

  1. 使用集中式数据库,例如 Firebase 实时数据库

  2. 将您的 Room 数据库数据导出到 txt 文件,然后在新手机上重新安装应用程序后,从 txt 文件导入(读取)数据。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?