簡體   English   中英

優化sqlite查詢並能夠比較對象和數據庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM