问题描述
我正在尝试让我的房间数据库在重新安装和使用新手机后保持不变。我目前正在使用键值备份,使用这个简单的代码:
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 版本。
解决方法
您有两个选择:
-
使用集中式数据库,例如 Firebase 实时数据库。
-
将您的
Room
数据库数据导出到 txt 文件,然后在新手机上重新安装应用程序后,从 txt 文件导入(读取)数据。