2013-10-02 28 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; 
} 
相關問題