android - 将我的应用程序的 sqlite db 替换为 android 30+ 中的备份数据库
问题描述
我创建了一个具有 sqlite 数据库的记事本应用程序。该应用程序允许用户将他的数据备份到谷歌驱动器。当用户点击恢复按钮时,我想恢复这些数据。问题是我无法访问 sqlite db 用谷歌驱动器中的备份文件替换它。
这个问题只发生在 android 29+ 上,如果我将 targetsdk 设置为 28,我的代码可以正常工作。但是google play不允许我上传targetsdk低于30的应用程序,所以我不得不增加sdk版本。这是我的代码任何建议将不胜感激:
File data = Environment.getDataDirectory();
String currentDBPath = "/data/" + getPackageName() + "/databases/" + Constants.dataBaseName;
File currentDB = new File(data, currentDBPath);
String destinationPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + Constants.dataBaseName;
File destination = new File(destinationPath);
try {
FileUtils.copyFile(destination, currentDB);
Snackbar.make(findViewById(R.id.activity_backup_restore), getString(R.string.successful_importing_db), Snackbar.LENGTH_LONG).show();
} catch (IOException e) {
Snackbar.make(findViewById(R.id.activity_backup_restore), getString(R.string.error_in_importing_db), Snackbar.LENGTH_LONG).show();
}
解决方案
在与 targetsdk 和不同的文件方法苦苦挣扎之后,我在 youtube 上看到了一个视频,并让我想到了使用 contextWrapper 类,我能够解决这个问题。这是我写的新代码:
ContextWrapper contextWrapper = new ContextWrapper(getApplicationContext());
File currentDB = contextWrapper.getDatabasePath(Constants.dataBaseName);
File destinationDirectory = contextWrapper.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);
File destination = new File(destinationDirectory, Constants.dataBaseName + ".db");
try {
FileUtils.copyFile(destination, currentDB);
Snackbar.make(findViewById(R.id.activity_backup_restore), getString(R.string.successful_importing_db), Snackbar.LENGTH_LONG).show();
} catch (IOException e) {
Snackbar.make(findViewById(R.id.activity_backup_restore), getString(R.string.error_in_importing_db), Snackbar.LENGTH_LONG).show();
}
推荐阅读
- angular - PrimeNg TabMenu Angular 11:在右侧设置最后一个选项卡
- python - 从包含特定字母的字符串创建字典
- javascript - 在按钮按钮加载之前触发的触摸事件
- testing - 使用 Stripe 测试 Shopify 结帐 API 时出错“无法在没有任何交易的情况下完成结帐。”
- c# - 带有两个正在运行的程序的 NLog
- c++ - 如何正确应用 std::map
- google-apps-script - 查找任何重复项的脚本,然后用新数据粘贴它们,或者如果没有重复项 - 将新数据粘贴到下一个空行中
- postgresql - 多对多与自定义列
- android - MediaMuxer 中的输出文件是什么,如何将其传递给 VideoView?
- bash - 在远程 .bashrc 中导出变量