我正在为复古游戏开发一个前端。在启动时,我从另一个应用程序解析了很多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/

10-09 00:36
查看更多