Android. Чтение базы данных из внешней папки - PullRequest
0 голосов
/ 19 марта 2019

Мне нужна помощь.Я не могу решить свою проблему.

Мне нужно восстановить базу данных из ранее сохраненного файла, который находится где-то в памяти телефона.

Я открываю экран выбора файла и получаю его в 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 - путь к выбранному пользователем файлу.После этих шагов я считываю данные из временного файла базы данных и переношу их в рабочую базу данных.

Я все делаю правильно?Или эта проблема решена по-другому?

В общем, моя задача - восстановить базу данных пользователя из сохраненной копии, которую он выбрал.

Пожалуйста, помогите мне решить мою проблему,Я повторяю их:

  1. Почему в разных версиях Android ACTION_GET_CONTENT возвращает разные URI в файл.Как добавить единообразное поведение?

  2. Правильно ли я решаю проблему восстановления базы данных, копируя файл в память приложения, а затем считывая его и записывая в базу данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...