优化sqlite查询并能够比较对象和数据库

时间:2015-08-02 17:37:56

标签: c# xml database sqlite

我正在开发复古游戏的前端。在启动时,我正在从另一个应用程序解析大量的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();
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

您最好的选择是用于比较对象而不自行编码所有内容的实体框架,但是根据您的项目类型,您可能无法访问它(例如Windows Phone项目)。

您的插入查询似乎已经过优化,但也许您可以使用Utils.randomColor()的异步插入来加快查询速度。

此处有关ConfigureAwait(false)的更多详细信息:How to massively improve SQLite Performance (using SqlWinRT)