我需要帮助。我无法解决我的问题。
我需要从以前保存的文件中还原数据库,该文件位于手机内存中的某个位置。
我打开文件选择屏幕,并在onActivityResult
中获取它。我的代码在下面。
private void onClickButtonRestoreFromFile() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
if (!FileManager.getInstance().selectFileDataBase(this)) {
return;
}
try {
startActivityForResult(intent, READ_REQUEST_CODE);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
if (resultData == null || !FileManager.getInstance().checkFileType(resultData.getData().getPath())) {
//if (resultData == null) {
MessageDialogView.showErrorResultMessage(getResources().getString(R.string.Message_Error_Open_File));
return;
}
Map<String, String> parameters = new HashMap<>();
parameters.put(NavigationManagerKeyParameters.RESTORE_DATA_BASE_ACTIVITY_DATA, resultData.getData().getPath());
NavigationManager.getInstance().navigateTo(NavigationManager.Pages.RestoreDataBaseActivity, parameters);
}
}
我从resultData.getData().getPath()
获得的URI取决于Android版本。例如,在Android 9(设备)上,resultData.getData().getPath()
返回的内容类似于 “ / external / storage /.../ file.sqlite” 。我在Android 5.1(仿真器)上得到的答案相同。
但是,在Android 5.1(Xaiomi)上,我得到类似 “ content://.../432”
为什么我要使用不同格式的URI?
之后,我将数据库文件复制到应用程序内存中的一个临时文件中。我通过以下方式进行操作:
private void copyDataBase() throws IOException {
InputStream input = mContext.getAssets().open(DB_NAME);
OutputStream output = new FileOutputStream(DB_PATH);
//перемещаем байты из входящего файла в исходящий
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
output.flush();
output.close();
input.close();
}
其中DB_NAME
是临时文件的名称,而DB_PATH
是用户选择的文件的路径。这些步骤之后,我从临时数据库文件中读取数据并将其传输到工作数据库中。
我所做的一切对吗?还是以其他方式解决了这个问题?
通常,我的任务是从用户选择的保存副本中恢复用户的数据库。
请帮助我解决问题。我重复一遍:
为什么在不同版本的Android ACTION_GET_CONTENT
上向文件返回不同的URI。如何添加统一行为?
我是否可以通过将文件复制到应用程序内存,然后将其读出并写入数据库来正确解决数据库恢复问题?