Мне нужна помощь.Я не могу решить свою проблему.
Мне нужно восстановить базу данных из ранее сохраненного файла, который находится где-то в памяти телефона.
Я открываю экран выбора файла и получаю его в 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);
}
}
URI, который я получаю от resultData.getData().getPath()
, зависит от версии 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 в файл.Как добавить единообразное поведение?
Правильно ли я решаю проблему восстановления базы данных, копируя файл в память приложения, а затем считывая его и записывая в базу данных?