将我的应用程序的sqlite数据库替换为android 30+中的备份数据库



我创建了一个记事本应用程序,它有一个sqlite数据库。该应用程序允许用户将自己的数据备份到谷歌硬盘。我想恢复这个数据,当用户点击恢复按钮。问题是我无法访问sqlite数据库来替换它与备份文件在谷歌驱动器。

这个问题只发生在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上看到了一个视频,并让我想到使用contextrapper类,我能够解决这个问题。下面是我写的新代码:

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();
}

最新更新