2013-06-03 49 views
1

在我的Windows Strore應用程序中我在隔離存儲中有SQLite數據庫。
我使用sqlite-net庫。
對於數據保存到數據庫中,我使用如下:在隔離存儲性能中插入到Sqlite數據庫

public static async Task Save<T>(List<T> items) 
    { 
     var serverFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync("FolgerName"); 
     var storageFile = await serverFolder.GetFileAsync("DataBaseName.sqlite"); 
     using (var db = new SQLiteConnection(storageFile.Path)) 
     { 
      Debug.WriteLine("Save to DataBase " + (typeof(T)) + " started " + DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond); 
      try 
      { 
       foreach (var item in items) 
       { 
        db.InsertOrReplace(item); 
       } 
       Debug.WriteLine("Save to DataBase " + (typeof(T)) + " success " + DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond); 
      } 
      catch 
      (SQLiteException ex) 
      { 
       Debug.WriteLine("Save to DataBase " + (typeof(T)) + " error. Result: " + ex.Result + " Message: " + ex.Message); 
      } 
     } 
    } 

我有問題關於性能:
1226對象在每個4分半鐘保存在數據庫中60場!
這很正常嗎?
我如何讓它更快?

更新

當我使用:

public static async Task Save<T>(List<T> items, Server server) where T : IHasId 
    { 
     var serverFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync(server.FolgerName); 
     var storageFile = await serverFolder.GetFileAsync("kaliti.sqlite"); 
     using (var db = new SQLiteConnection(storageFile.Path)) 
     { 
      Debug.WriteLine("Save to DataBase " + (typeof(T)) + " started" + String.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now)); 
      try 
      { 
       var table = db.Table<T>(); 
       var idList = new List<int>(); 
       foreach (var i in table) 
       { 
        idList.Add(i.Id); 
       } 
       foreach (var item in items) 
       { 
        if (idList.Contains(item.Id)) 
         { 
          db.Delete<T>(item.Id); 
         } 
        db.Insert(item); 
       } 
       Debug.WriteLine("Save to DataBase " + (typeof(T)) + " success" + String.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now)); 
      } 
      catch 
      (SQLiteException ex) 
      { 
       Debug.WriteLine("Save to DataBase " + (typeof(T)) + " error. Result: " + ex.Result + " Message: " + ex.Message); 
      } 
     } 
    } 

和數據庫是空的我也有同樣的東西。

+1

爲InsertOrReplace的代碼是在這裏關鍵 – Steve

+0

OK,但是當數據庫是空的,我只用插入 - 我有同樣的東西(( – jimpanzer

回答

1

您需要在事務內部儘可能多地運行數據庫調用。這樣做會大大加快速度。下面是一個簡單的交易,使用代碼從您的第一個例子:

... 
try 
{ 
    db.RunInTransaction(() => 
    { 
     foreach (var item in items) 
     { 
      db.InsertOrReplace(item); 
     } 
    }); 
... 
+0

優雅!謝謝,而不是4分半鐘,現在我有幾秒鐘了。 – jimpanzer