2013-10-02 26 views
2

我在写一个Windows应用商店应用程序。我必须在某些情况下重新创建数据库(测试,新用户等) - 正在使用Sqlite。我需要将现有数据库复制到备份中,删除现有数据库,然后使用模式创建新的数据库文件。无法删除Windows Store应用程序中的文件 - 访问被拒绝。 (HRESULT:0x80070005(E_ACCESSDENIED))

代码:

public async Task<bool> CreateDatabaseAsync() 
    { 

     if (await PathUtils.FileExistsAsync(DbConstants.DbFileWithPath)) 
     { 
      var currentDbFolder = await StorageFolder.GetFolderFromPathAsync(DbConstants.DbPath); 
      var currentdbFile = await StorageFile.GetFileFromPathAsync(DbConstants.DbFileWithPath); 
      await currentdbFile.CopyAsync(currentDbFolder, DbConstants.DbBackup, NameCollisionOption.ReplaceExisting); 

      //problem here with deletion 
      await currentdbFile.DeleteAsync(DbConstants.FilelDeletionOption); 
     } 
     return await CreateSchema(); 
    } 

    private async Task<bool> CreateSchema() 
    { 
     var db = new SQLiteAsyncConnection(DbConstants.DbFileWithPath); 
     await db.CreateTablesAsync(typeof (Doc), typeof(DocAttachment)); 
     db = null; 
     GC.Collect(); 
     return true; 
    } 
} 

如果我调用方法CreateDatabaseAsync()连续两次,数据库文件将在第一次调用过程中创建和UnauthorizedAccessException将其删除在第二个呼叫过程中被抛出 - 看到评论。我不知道什么可以打开这个文件。看到我将对SQliteAsyncConnetion的引用归为空,并强制收集所有代。不过,我无法删除文件 - {“访问被拒绝(来自HRESULT的异常:0x80070005(E_ACCESSDENIED))”}。

正在ApplicationData.Current.LocalFolder.Path中创建文件。

目前我正在尝试在每次集成测试期间重新创建数据库。

回答

4

问题是SQLiteAsyncConnection实现了一个连接池 - 池的副作用是保持db文件打开。

我能看到的唯一解决方案是使用API​​的同步版本。没有池,它允许您关闭数据库连接,因此关闭文件:

private bool CreateSchema() 
{ 
    using (var db = new SQLiteConnection(DbConstants.DbFileWithPath)) 
    { 
     db.CreateTables(typeof (Doc), typeof(DocAttachment)); 
    } 
    return true; 
} 
相关问题