我正在为复古游戏开发一个前端。在启动时,我从另一个应用程序解析了很多XML文件,因此我得到了一个“系统”列表,每个系统都包含一个“游戏”列表。解析xml数据确实很快,但将所有这些内容写入sqlite数据库却不是。目前它需要大约25秒(20000张唱片),这可能不算太糟,但希望我能得到一些想法,如何使它更快。
理想情况下,我希望能够将包含所有数据的对象与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项目)。
您的insert查询看起来非常优化,但是您可以使用异步insert和ConfigureAwait(false)
来加快它的速度。
有关ConfigureAwait
的更多详细信息,请点击:How to massively improve SQLite Performance (using SqlWinRT)
关于c# - 优化sqlite查询并能够比较对象和数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31774685/