如何将文件保存到外部存储,目前它创建文档但大小为 0B

how to save file to external storage, currently it creates document but it size is 0B

我想用新方法备份我的数据库,我的目标 sdk 是 30,我不知道我在这里做错了什么。 我将类型传递给 setType,但它只创建 0B 的文件。我怎样才能正确备份数据库。

我现在正在做的是

Intent i = new Intent(Intent.ACTION_CREATE_DOCUMENT);
i.setType("application/x-sqlite3");
i.putExtra(Intent.EXTRA_TITLE, DATABASE_NAME);
startActivity(i);
Toast.makeText(this, "done", Toast.LENGTH_SHORT).show();

那么当用户按下导出按钮时,我如何将我的数据库和数据存储到外部存储器

首先,开始 activity 结果

Intent i = new Intent(Intent.ACTION_CREATE_DOCUMENT);
i.setType("application/x-sqlite3");
startActivityForResult(i, BACKUP_CODE);

之后它将创建大小为 0 B 的文件,因此我们必须在 onActivityResult 中写入备份。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == BACKUP_CODE) {
        try {
            assert data != null;
            FileOutputStream stream = (FileOutputStream) getContentResolver().openOutputStream(data.getData());
            Files.copy(Paths.get(getDatabasePath(DATABASE).toPath()), stream);
            Toast.makeText(this, "done", Toast.LENGTH_SHORT).show();
            stream.close(); ///very important
        } catch (Exception e) {
            Toast.makeText(this, "Error occurred in backup", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }
}

它将成功创建备份。它对我有用。