You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin中使用Android存储访问框架:保存已有DB3文件及文件访问问题

Xamarin Android 利用Storage Access Framework处理SQLite文件

一、保存已有SQLite文件到SD卡

你当前的代码仅创建空文件,要将已有db3文件写入用户选择的位置,需在用户通过ACTION_CREATE_DOCUMENT选定保存路径后,把本地数据库内容复制到目标文件中:

  • 重写OnActivityResult方法,获取用户选择的文件URI
  • 通过ContentResolver打开该URI对应的输出流
  • 将本地已有db3文件的内容写入到输出流中

示例代码:

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);

    if (requestCode == 40 && resultCode == Result.Ok && data != null)
    {
        // 获取用户选择的保存URI
        Uri saveUri = data.Data;
        // 本地已有db3文件的路径(替换成你实际的数据库路径)
        string localDbPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), "your_local_db.db3");

        try
        {
            // 打开本地数据库文件的输入流
            using (FileStream inputStream = new FileStream(localDbPath, FileMode.Open, FileAccess.Read))
            {
                // 通过ContentResolver打开目标文件的输出流
                using (Stream outputStream = ContentResolver.OpenOutputStream(saveUri))
                {
                    // 复制文件内容
                    inputStream.CopyTo(outputStream);
                }
            }
            // 保存成功提示
            Toast.MakeText(this, "数据库保存成功", ToastLength.Short).Show();
        }
        catch (Exception ex)
        {
            Toast.MakeText(this, $"保存失败: {ex.Message}", ToastLength.Long).Show();
        }
    }
}

注意:替换localDbPath为你应用中实际的SQLite数据库文件路径。

二、打开SD卡中的SQLite文件并访问

用户通过ACTION_OPEN_DOCUMENT选择文件后,SQLite无法直接通过Content URI访问文件,需先将文件复制到应用私有目录或缓存目录,再进行数据库操作:

  • 在OnActivityResult中获取选中文件的URI
  • 通过ContentResolver打开输入流,将文件复制到应用私有目录
  • 使用复制后的本地路径初始化SQLite连接

示例代码:

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);

    if (requestCode == 50 && resultCode == Result.Ok && data != null)
    {
        Uri fileUri = data.Data;
        // 复制到应用私有目录的临时路径
        string tempDbPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), "temp_imported.db3");

        try
        {
            // 打开选中文件的输入流
            using (Stream inputStream = ContentResolver.OpenInputStream(fileUri))
            {
                // 打开本地临时文件的输出流
                using (FileStream outputStream = new FileStream(tempDbPath, FileMode.Create, FileAccess.Write))
                {
                    inputStream.CopyTo(outputStream);
                }
            }

            // 现在可以用这个临时路径打开SQLite数据库
            var sqliteConnection = new SQLiteConnection(tempDbPath);
            // 执行数据库操作,比如查询
            var dataList = sqliteConnection.Query<YourModel>("SELECT * FROM YourTable");
            
            // 操作完成后可根据需求删除临时文件
            // File.Delete(tempDbPath);
            Toast.MakeText(this, "数据库加载成功", ToastLength.Short).Show();
        }
        catch (Exception ex)
        {
            Toast.MakeText(this, $"加载失败: {ex.Message}", ToastLength.Long).Show();
        }
    }
}

说明:

  • YourModel需要替换成你实际的数据模型类
  • 临时文件可以在使用完成后删除,也可以保留供后续使用
  • 若需长期访问该文件,可通过ContentResolver.TakePersistableUriPermission获取持久权限,避免下次打开需重新选择

内容的提问来源于stack exchange,提问作者randycobb12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:03:32