【问题标题】:How to save db to external storage so user can see it? In Xamarin Forms如何将数据库保存到外部存储以便用户可以看到?在 Xamarin 表单中
【发布时间】:2021-06-03 23:47:10
【问题描述】:

我想为用户生成一个数据库,以便他可以备份它。我想出了这段代码:

private async void ExportButton_Clicked(object sender, EventArgs e)
    {
        var dest = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        var filePath = System.IO.Path.Combine(dest, "SpotterBackup.db3");
        
        if (File.Exists(_dbPath))
        {
            if (File.Exists(filePath))
            {
                File.Delete(filePath);
            }
            File.Copy(_dbPath, filePath);
        }
    }

但这只是写入内部存储,我已经搜索了一些解决方案,我刚刚找到了一些 java lang 解决方案。如何将 db 保存到 xamarin 的外部存储中?

【问题讨论】:

标签: c# xamarin android-external-storage


【解决方案1】:

您可以尝试使用以下代码将数据库文件复制到外部路径。我将 db 文件复制到下载文件夹。

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Java.IO;
using Notes.Droid;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xamarin.Forms;

[assembly: Dependency(typeof(GetDBFile1))]
namespace Notes.Droid
{

    class GetDBFile1 : ICopyDB
    {
        public void copy()
        {

            //  My Db orignal file path  string path1 = "/data/user/0/com.companyname.Notes/files/Notes3.db";
            string path = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "Notes3.db3");
          
            File f = new File(path);


            FileInputStream fis = null;
            FileOutputStream fos = null;

            fis = new FileInputStream(f);
          
         
            fos = new FileOutputStream("/storage/emulated/0/Download/databasename.db");
            while (true)
            {
                int i = fis.Read();
                if (i != -1)
                { fos.Write(i); }
                else
                { break; }
            }
            fos.Flush();

            Toast.MakeText(Android.App.Application.Context, "DB dump OK", ToastLength.Short).Show();


            fos.Close();
            fis.Close();
        }

    }
      
    }

并在AndroidManifest.xml<application>标签中添加android:requestLegacyExternalStorage="true"

这是运行截图。

注意:如果在 android 11 或更高版本中运行此代码,Google 不允许应用程序访问外部文件夹和requestLegacyExternalStorage will be ignored

在 Android 11 上运行但以 Android 10(API 级别 29)为目标的应用仍然可以请求 requestLegacyExternalStorage 属性。此标志允许应用程序暂时选择退出与范围存储相关的更改,例如授予对不同目录和不同类型媒体文件的访问权限。在您将应用更新为面向 Android 11 后,系统会忽略 requestLegacyExternalStorage 标志。

查看主题管理设备存储

从 Android 11 开始,使用范围存储模型的应用只能访问自己的应用特定缓存文件。如果您的应用需要管理设备存储

因此,我们无法在 android 11 或更高版本(如 iOS 的沙盒设计)中将文件写入公共外部存储。

【讨论】:

  • 如果回复有帮助,请采纳为答案(点击该答案左上角的“✔”),对有类似问题的人有帮助
  • 谢谢,很好的答案,我也知道当它在 Android 11 上被拒绝时,可以直接在谷歌驱动器、保管箱等上上传吗?
  • 仅供参考:您仍然可以写入应用程序的外部包路径,并且独立于 API 级别并且可以公开访问:stackoverflow.com/questions/54126671/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2023-03-21
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
相关资源
最近更新 更多