Андроид. Чтение базы данных из внешней папки

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

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

Я открываю экран выбора файла и получаю его 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() возвращает что-то вроде "/ внешнее/хранилище/.../файл.sqlite". Тот же ответ я получаю на Android 5.1 (эмулятор).

Однако на Android 5.1 (Xaiomi) я получаю что-то вроде "содержание://.../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. Правильно ли я решаю задачу восстановления базы данных, скопировав файл в память приложения, а затем прочитав его и записав в базу данных?

Почему бы не использовать папку активов для размещения вашей базы данных

vimukthi 19.03.2019 16:40

@vimukthi Что ты имеешь в виду? Пожалуйста, объясните подробнее?

Alexander Ananev 19.03.2019 19:13

Там у вас проблема с путем внешней базы данных. так что вы можете использовать папку с ресурсами, чтобы решить те проблемы, с которыми вы столкнулись там.

vimukthi 20.03.2019 03:27

@vimukthi Пользователь сам выбирает, где находится его файл с базой данных. Это может быть SD-карта, память телефона, GDrive, OneDrive и т.д. Или вы предлагаете переместить выбранный файл в папку Assets, и только потом с ним работать?

Alexander Ananev 20.03.2019 09:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
75
0

Другие вопросы по теме