首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Xamarin.Forms如何备份SD卡中的SQLite数据库

Xamarin.Forms如何备份SD卡中的SQLite数据库
EN

Stack Overflow用户
提问于 2018-06-04 08:20:39
回答 1查看 2.1K关注 0票数 3

我在我的项目中有一个SQLite数据库,我想添加一个备份功能来将该数据库保存在SD卡中。有没有什么简单的方法可以在使用Xamarin.Forms的安卓和IOS系统上做到这一点?我在老问题(其中一些是非常老的)中搜索,但我找不到一个明确的答案。

EN

回答 1

Stack Overflow用户

发布于 2018-06-04 09:08:37

iOS:

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

使用此目录存储用户生成的内容。这个目录的内容可以通过文件共享提供给用户;因此,他的目录应该只包含您希望向用户公开的文件。此目录的内容由iTunes和iCloud备份。

因此,假设您的数据库使用的是App Support目录,您应该是:

代码语言:javascript
复制
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);
}

复制到应用程序的doc目录非常简单,只需:

代码语言:javascript
复制
public void CopyDBToDocs(string dbFileName)
{
    var docDir = NSSearchPath.GetDirectories(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0];
    File.Copy(GetDBPath(dbFileName), Path.Combine(docDir, dbFileName));
}

Android:

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

就像这样简单:

代码语言:javascript
复制
public void CopyDBToSdCard(string dbName)
{
    File.Copy(GetDBPath(dbName), Path.Combine(Android.OS.Environment.DirectoryDownloads, dbName);
}

本例中的GetDBPath实际上使用的是“真实”数据库目录,它是应用程序沙箱中的"FileDir“位置的子目录:

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
<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是最简单的方法。基本上,您需要检查权限是否已被授予,如果没有,则向用户显示为什么需要权限,然后让操作系统要求用户接受/拒绝请求。然后,您将收到这些perm结果的通知。

注意: JamesM为非粗体编码人员提供了表单的Perm插件;-) PermissionsPlugin

代码语言:javascript
复制
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返回

代码语言:javascript
复制
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;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50672131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档