安卓从外部文件夹读取数据库

时间:2019-03-19 12:49:58

标签: java android sqlite android-intent

我需要帮助。我无法解决我的问题。

我需要从以前保存的文件中还原数据库,该文件位于手机内存中的某个位置。

我打开文件选择屏幕,并在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是用户选择的文件的路径。这些步骤之后,我从临时数据库文件中读取数据并将其传输到工作数据库中。

我所做的一切对吗?还是以其他方式解决了这个问题?

通常,我的任务是从用户选择的保存副本中恢复用户的数据库。

请帮助我解决问题。我重复一遍:

  1. 为什么在不同版本的Android ACTION_GET_CONTENT上向文件返回不同的URI。如何添加统一行为?

  2. 我是否可以通过将文件复制到应用程序内存,然后将其读出并写入数据库来正确解决数据库恢复问题?

0 个答案:

没有答案