【问题标题】:SQLite Backup in UWP C#UWP C# 中的 SQLite 备份
【发布时间】:2019-08-09 01:57:01
【问题描述】:

我正在尝试在我的 UWP 应用中为 SQLite3 创建数据库备份。基于 SQLite (https://www.sqlite.org/backup.html) 的在线备份 API,我编写了以下方法。 backup_init 正在返回扩展错误代码 7。SQLite 文档中的定义:

(7) SQLITE_NOMEM

SQLITE_NOMEM 结果代码表明 SQLite 无法分配完成操作所需的所有内存。换句话说,在需要分配的内存以继续操作的情况下,对 sqlite3_malloc() 或 sqlite3_realloc() 的内部调用失败。

我不熟悉 C# 中的指针,我认为我对它们有误。任何帮助表示赞赏。

    public static string BackupDB()
    {
        IntPtr pDb = Marshal.StringToHGlobalUni(Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "DB.sqlite")); //Database to backup
        string zFilename = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "DBBACKUP.sqlite"); //destination db path

        string debug = "";
        IntPtr pFile; //Database connection opened on zFilename
        IntPtr pBackup; //Backup handle used to copy data


        /* Open the database file identified by zFilename. */
        var rc = SQLite3.Open(zFilename, out pFile);
        debug += rc.ToString();

        if (rc == SQLite.Net.Interop.Result.OK)
        {
            /* Open the sqlite3_backup object used to accomplish the transfer */
            pBackup = SQLite3.sqlite3_backup_init(pFile, "main", pDb, "main");

            if (pBackup != null)
            {
                /* Each iteration of this loop copies 5 database pages from database
                ** pDb to the backup database. If the return value of backup_step()
                ** indicates that there are still further pages to copy, sleep for
                ** 250 ms before repeating. */
                do
                {
                    rc = SQLite3.sqlite3_backup_step(pBackup, 5);

                    //xProgress(
                    //    sqlite3_backup_remaining(pBackup),
                    //    sqlite3_backup_pagecount(pBackup)
                    //);
                    if (rc == SQLite.Net.Interop.Result.OK || rc == SQLite.Net.Interop.Result.Busy || rc == SQLite.Net.Interop.Result.Locked)
                    {
                        SQLite3.sqlite3_sleep(250);
                    }
                } while (rc == SQLite.Net.Interop.Result.OK || rc == SQLite.Net.Interop.Result.Busy || rc == SQLite.Net.Interop.Result.Locked);

                /* Release resources allocated by backup_init(). */
                SQLite3.sqlite3_backup_finish(pBackup);
            }

            debug += SQLite3.sqlite3_extended_errcode(pBackup);
        }

        /* Close the database connection opened on database file zFilename
        ** and return the result of this function. */
        SQLite3.Close(pFile);

        return debug;
    }

【问题讨论】:

    标签: c# sqlite uwp backup


    【解决方案1】:

    根据您的代码 sn-p,您使用的是 SQLite.Net-PCL nuget 包。

    首先,我无法用上面的代码重现您的问题,我可以初始化并获取pBackup 对象。

    其次,实际上你不需要如此复杂的方式来备份 uwp app 中的 SQLite 文件。 SQLite 备份有三种方式,其中一种是使用外部工具复制数据库文件。在 uwp 中,有 API 可以复制文件。您可以使用StorageFile 类的CopyAsync 方法来备份数据库文件。例如:

    public static async void BackupDBByCopy()
    {
        StorageFolder localfolder = ApplicationData.Current.LocalFolder;        
        StorageFile dboriginal = await localfolder.GetFileAsync("DB.sqlite");         
        await dboriginal.CopyAsync(localfolder, "DBBACKUP.sqlite", NameCollisionOption.ReplaceExisting);
    }
    

    【讨论】:

    • 如果我必须将该数据库备份文件导出/复制到外部 USB 拇指驱动器上怎么办?
    • @FAQi,差不多,不过要看StorageFolder 是否可以访问USB设备。查看removableStorage 了解更多详情。如果您在实现该功能时遇到问题,您可以询问一个新线程并提供详细信息。
    猜你喜欢
    • 2019-12-16
    • 2016-06-20
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 2016-09-23
    相关资源
    最近更新 更多