[英]Optimize sqlite query and being able to compare object and database
我正在開發復古游戲的前端。 在啟動時,我從另一個應用程序解析了許多xml文件,因此最終得到一個“系統”列表,每個系統都包含一個“游戲”列表。 解析xml數據確實非常快,但是將所有這些信息寫入sqlite數據庫卻並非如此。 目前大約需要25秒(20.000條記錄),這可能還不錯,但是希望我能對如何更快地有所了解。
理想情況下,我希望能夠將包含所有數據的對象與sqlite數據庫進行比較。 如果xml文件/解析的對象中的任何內容已更改,則應更新數據或從數據庫中刪除數據。 有沒有更好的方法來解決此問題,然后進行初始導入,然后轉儲所有數據庫並將其與對象進行比較? 基本上整個導入代碼都向后...
這是我當前的代碼:
public static void PopulateDatabase(List<RetroBoxSystem> systems)
{
using (SQLiteConnection con = new SQLiteConnection("Data Source=RetroBox.db;Version=3;"))
{
con.Open();
using (SQLiteTransaction tr = con.BeginTransaction())
{
using (SQLiteCommand cmd = con.CreateCommand())
{
foreach (var system in systems)
{
cmd.CommandText = @"INSERT OR IGNORE INTO systems(system_id, name)
VALUES ((SELECT system_id FROM systems WHERE name = @name), @name)";
cmd.Parameters.Add(new SQLiteParameter("@name", system.Name));
cmd.ExecuteNonQuery();
}
}
using (SQLiteCommand cmd = con.CreateCommand())
{
cmd.CommandText = @"INSERT OR IGNORE INTO games(game_id, system_id, name, description, cloneof, manufacturer, genre, rating, year)
VALUES ((SELECT game_id FROM games WHERE name = @name), (SELECT system_id FROM systems WHERE name = @system), @name, @description, @cloneof, @manufacturer, @genre, @rating, @year)";
foreach (var system in systems)
{
foreach (var g in system.GameList)
{
cmd.Parameters.Add(new SQLiteParameter("@system", system.Name));
cmd.Parameters.Add(new SQLiteParameter("@name", g.Name));
cmd.Parameters.Add(new SQLiteParameter("@description", g.Description));
cmd.Parameters.Add(new SQLiteParameter("@cloneof", g.CloneOf));
cmd.Parameters.Add(new SQLiteParameter("@manufacturer", g.Manufacturer));
cmd.Parameters.Add(new SQLiteParameter("@genre", g.Genre));
cmd.Parameters.Add(new SQLiteParameter("@rating", g.Rating));
cmd.Parameters.Add(new SQLiteParameter("@year", g.Year));
cmd.ExecuteNonQuery();
}
}
}
tr.Commit();
}
}
}
最好的選擇是比較對象而不用自己編寫所有內容的實體框架,但是根據您的項目類型,您可能無權訪問它(例如Windows Phone項目)。
您的插入查詢似乎已經過優化,但是也許可以通過使用帶有ConfigureAwait(false)
異步插入來使其更快。
有關ConfigureAwait
更多詳細信息,在這里: 如何大幅提高SQLite性能(使用SqlWinRT)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.