代码之家  ›  专栏  ›  技术社区  ›  David Huthaifah Kholi

还原数据库时提取zip文件

  •  1
  • David Huthaifah Kholi  · 技术社区  · 7 年前

    我已经为我的应用程序创建了备份和还原过程。运行备份时,它将在与数据库相同的目录中创建sqlite数据库的.zip文件。

    还原数据库时,它将重命名数据库,并将其从 EPOSDatabase.db3 tempEPOS.db3

    然后,它获取所选文件并将其提取到相同的位置,在名称下 eposdata数据库.db3 ,然后删除重命名的临时数据库。

    string dbPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
    
    if (File.Exists(dbPath + "/tempEPOS.db3"))
      {
        File.Delete(dbPath + "/tempEPOS.db3");
      };
    
      File.Move(dbPath + "/EPOSDatabase.db3", dbPath + "/tempEPOS.db3");
    
      ZipFile.ExtractToDirectory(dbPath + "/" + fileToRestore, dbPath + "/EPOSDatabase.db3");
    
      File.Delete(dbPath + "/tempEPOS.db3");
    

    我的问题是,当我有打开连接的代码时,例如在执行还原后打开系统设置页时,我会得到一个错误:

    “无法打开数据库文件:/data/user/0/com.companyname.acplus_mobileepos/files/eposdatabase.db3(cannotopen)”

    作为进一步的调试测试,我在应用程序的启动中添加了以下代码:

    string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
    
    foreach (var file in Directory.GetFiles(path))
    {
       string strFile = Convert.ToString(file);
    }
    
    public readonly string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "EPOSDatabase.db3");
    
    var db = new SQLiteConnection(dbPath);
    db.CreateTable<Category>();
    db.CreateTable<SystemSettings>();
    
    db.Close();
    

    在foreach循环中,它只找到了我试图还原的原始.zip文件。

    当它到达终点时 var db = new SQLiteConnection(dbPath);

    无法用消息创建数据库

    “无法打开数据库文件:/data/user/0/com.companyname.acplus-mobileepos/files/eposdatabase.db3”

    文件似乎不存在,所以没有正确提取,但如果是这样,为什么它不只是创建一个新的数据库,而不是试图打开它?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Nkosi    7 年前

    提取逻辑需要重新检查。

    明确地 ExtractToDirectory .

    将指定zip存档中的所有文件提取到文件系统上的一个目录。

    public static void ExtractToDirectory (string sourceArchiveFileName, string destinationDirectoryName);
    

    在原始代码中

    ZipFile.ExtractToDirectory(dbPath + "/" + fileToRestore, dbPath + "/EPOSDatabase.db3");
    

    zip文件的内容正在解压缩到 目录 打电话 {path}/EPOSDatabase.db3/ .

    如果目标只是从归档文件中提取到目录,那么只需要目录位置。

    ZipFile.ExtractToDirectory(dbPath + "/" + fileToRestore, dbPath);
    

    此外,在删除旧文件之前,应进行检查,以确保还原后所需的文件确实存在。

    //... extraction code omitted for brevity
    
    if (!File.Exists(dbPath + "/EPOSDatabase.db3")) {
        //...either throw error or alert that database is not present
    
        //...could consider return old file back to original sate (optional)
    } else {
        File.Delete(dbPath + "/tempEPOS.db3");
    }