【问题标题】:Xamarin Forms, sqlite-net-pcl, Android database file locationXamarin Forms、sqlite-net-pcl、Android 数据库文件位置
【发布时间】:2018-12-06 11:10:54
【问题描述】:

我在不同版本的 Android 上运行的 Xamarin Forms 应用程序中使用 SQLite(通过“sqlite-net-pcl”nuget 包)。

出于诊断目的,我需要将数据库文件下载到 PC(即使仅在调试模式下),但似乎无论我将它放在哪个 Android 文件夹中,之后我都找不到它。

我(默认情况下)将文件放在...

System.IO.Path.Combine(Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "database.db")

请注意,在上面我使用 Mono 库而不是 Android 库来查找文件夹。

我已经尝试了大多数“Environment.SpecialFolder”选项,理想情况下,我想要一种方法来确定“Downloads”文件夹的路径,当通过 USB 从 PC 浏览到设备时可用该文件夹(这台 PC \MyDevice\Internal shared storage\Download),但我无法确定该文件夹在不同设备和 Android 版本中的位置。

谁能告诉我如何获取“下载”文件夹的路径,甚至如何获取该文件夹的父文件夹以便我可以创建自己的子文件夹?我怀疑我将需要使用 Android.OS.Environment.DirectoryDownloads 或类似的,但我似乎无法做到这一点。

谢谢。

【问题讨论】:

  • 你找不到它的原因是它被隐藏了,它的安卓防火墙试图从外部应用程序和设备中隐藏这些数据,你为什么还需要这个?
  • 正如我所说,我希望能够从设备下载数据库文件以进行诊断。在正常操作中,这不是必需的。

标签: android sqlite xamarin


【解决方案1】:

您可以在 Android 上以这样的方式本地执行此操作:

File sd = Environment.GetExternalStoragePublicDirectory(Environment.ExternalStorageDirectory.Path);
if(sd.CanWrite())
{
       string currentDBPath = sqlConnectionObj.DatabasePath;
       string backupDBPath = "backupname.db";
       File currentDB = new File(currentDBPath);
       File backupDB = new File(sd, backupDBPath);
       if(currentDB.Exists())
        {
           FileChannel src = new FileInputStream(currentDB).Channel;
           FileChannel dst = new FileOutputStream(backupDB).Channel;
           dst.TransferFrom(src, 0, src.Size());
           src.Close();
           dst.Close();          
        }
}          

这应该在你的 sd 卡根路径中创建一个数据库文件

哦,是的,别忘了在清单中设置写入 SD 卡的权限,如下所示。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

如果还没有,您可能还需要更改检查运行时权限。

【讨论】:

  • 谢谢;我曾希望能够简单地就地读/写数据库,而不必复制它。
  • 这就是您可以做的,因为该文件在您的应用之外不可用。
猜你喜欢
  • 2017-06-24
  • 2021-08-13
  • 2023-03-19
  • 2018-07-06
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多