gpt4 book ai didi

sqlite - Xamarin.Forms 如何在 SD 卡中备份 SQLite 数据库

转载 作者:行者123 更新时间:2023-12-03 15:55:45 24 4
gpt4 key购买 nike

我的项目中有一个 SQLite 数据库,我想添加一个备份功能以将该数据库保存在 SD 卡中。是否有任何简单的方法可以使用 Xamarin.Forms 为 Android 和 IOS 执行此操作?我在旧的(其中一些是非常旧的)问题中进行了搜索,但找不到明确的答案。

最佳答案

iOS:

iOS 上没有“sdcard”,但您可以将数据库复制 (File.Copy) 到应用程序的 Documents 目录,以便通过 iTunes 应用程序访问它这样您就可以复制到您的 PC/Mac:

Use this directory to store user-generated content. The contents of this directory can be made available to the user through file sharing; therefore, his directory should only contain files that you may wish to expose to the user. The contents of this directory are backed up by iTunes and iCloud.

所以假设您正在为您的数据库使用 App Support 目录,您应该:

public string GetDBPath(string dbFileName)
{
// If you are not using App Support directory for your DBs you are doing it wrong on iOS ;-)
var supportDir = NSSearchPath.GetDirectories(NSSearchPathDirectory.ApplicationSupportDirectory, NSSearchPathDomain.User, true)[0];
var dbDir = Path.Combine(supportDir, "database");
if (!Directory.Exists(dbDir))
Directory.CreateDirectory(dbDir);
return Path.Combine(supportDir, dbDir, dbFileName);
}

复制到您应用程序的文档目录非常简单:

public void CopyDBToDocs(string dbFileName)
{
var docDir = NSSearchPath.GetDirectories(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0];
File.Copy(GetDBPath(dbFileName), Path.Combine(docDir, dbFileName));
}

安卓:

在 Android 上,这可能非常简单,也可能很痛苦,具体取决于设备的 API 以及您正在开发的应用的 Android API 目标。

简单如:

public void CopyDBToSdCard(string dbName)
{
File.Copy(GetDBPath(dbName), Path.Combine(Android.OS.Environment.DirectoryDownloads, dbName);
}

GetDBPath 在这种情况下实际上使用的是“真实”数据库目录,它是应用程序沙盒“FileDir”位置的子目录:

public string GetDBPath(string dbFileName)
{
// FYI: GetDatabasePath("") fails on some APIs &| devices &|emulators so hack it... (Some API 23 devices, but not API 21, 27, 28, ...)
var dbPath = context.GetDatabasePath("ZZZ").AbsolutePath.Replace("/ZZZ", "");
if (!Directory.Exists(dbPath))
Directory.CreateDirectory(dbPath);
return context.GetDatabasePath(dbFileName).AbsolutePath;
}

现在要实际执行该文件从应用程序复制到“外部”位置,需要应用程序的 list 权限:

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

此外,如果您的应用具有“目标”并且在 API-23 (Android 6.0) 或更高版本上运行,您需要在运行时征得用户同意该权限。

使用 Android.Support.Compat 是最简单的方法。基本上你需要检查权限是否已经被授予,如果没有告诉用户你为什么需要权限然后让操作系统要求用户接受/拒绝请求。然后您会收到有关烫发结果的通知。

注意:JamesM 为非粗体编码器提供了 Forms' Perm 插件 ;-) PermissionsPlugin

void GetExternalPerms()
{
const string writePermission = Manifest.Permission.WriteExternalStorage;
const string readPermission = Manifest.Permission.ReadExternalStorage;
string[] PermissionsLocation =
{
writePermission, readPermission
};
if ((ContextCompat.CheckSelfPermission(this, writePermission) == Permission.Granted) && (ContextCompat.CheckSelfPermission(this, readPermission) == Permission.Granted))
{
return;
}
if (ActivityCompat.ShouldShowRequestPermissionRationale(this, writePermission))
// Displaying a dialog would make sense at this point...
}
ActivityCompat.RequestPermissions(this, PermissionsLocation, 999);
}

然后用户接受或拒绝该请求的结果将通过OnRequestPermissionsResult返回:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
switch (requestCode)
{
case 999: // This is the code that we supply via RequestPermissions
if (grantResults[0] == Permission.Granted)
{
// you have permission, so defer to your DB copy routine now
}
break;
default:
break;
}
}

关于sqlite - Xamarin.Forms 如何在 SD 卡中备份 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50672131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com