如何批量插入SQLITE数据库?

时间:2016-04-21 19:01:19

标签: c# sqlite win-universal-app

我正在开发UWP应用程序。

我有一个数据库,应该用大约20,000条记录进行初始化。记录,定义如下:

private static readonly ObservableCollection<TickRecord> TickRecords = new ObservableCollection<TickRecord>();

我试图像这样一次插入一条记录:

private void CreateFakeTickRecords()
{
if ( Database.Database.CountTickRecords() > 0 )
    {
    return;
    }

foreach ( var tickRecord in TickRecords )
    {
    Database.Database.AddOrUpdateTickRecord( tickRecord );
    }
}

public static void AddOrUpdateTickRecord( TickRecord tickRecord )
{
    // Create a new connection
    using ( var db = new SQLiteConnection( new SQLitePlatformWinRT(), DbPath ) )
    {
    if ( tickRecord.Id == 0 )
        {
        // New
        db.Insert( tickRecord );
        }
    else
        {
        // Update
        db.Update( tickRecord );
        }
    }
}

此代码工作正常,但速度太慢。

我想修改它,以便我可以进行&#34;批量插入&#34;。

我该怎么做?

THX

3 个答案:

答案 0 :(得分:2)

您应该在单个sqllite事务中插入所有20K记录。

这样的事情:

    public static void AddOrUpdateTickRecords( ObservableCollection<TickRecord> tickRecords )
        {
        // Create a new connection
        using ( var db = new SQLiteConnection( new SQLitePlatformWinRT(), DbPath ) )
            {
            db.BeginTransaction();
            try
                {
                foreach ( var tickRecord in tickRecords )
                    {
                    if ( tickRecord.Id == 0 )
                        {
                        // New
                        db.Insert( tickRecord );
                        }
                    else
                        {
                        // Update
                        db.Update( tickRecord );
                        }
                    }

                db.Commit();
                }
            catch ( Exception )
                {
                db.Rollback();
                }
            }
        }

答案 1 :(得分:2)

尝试使用InsertAll和UpdateAll函数。希望这只打开一次数据库表并立即插入/更新所有内容。您需要提前确定要插入/更新的对象,但这仍然可以加快速度。

List<TickRecords> updates = new List<TickRecords>(); 

List<TickRecords> inserts = new List<TickRecords>();  

foreach ( var tickRecord in tickRecords ) 
{   
    if ( tickRecord.Id == 0 )
    {       
        updates.Add(tickRecord);
    }
    else
    {       
        inserts.Add(tickRecords);
     } 
}



using ( var db = new SQLiteConnection( new SQLitePlatformWinRT(), DbPath ) ) 
{
     db.InsertAll(inserts);
     db.UpdateAll(updates);
}

答案 2 :(得分:1)

我修改了Bibek的答案以使其与UWP匹配:

        public static void AddOrUpdateTickRecords( ObservableCollection<TickRecord> tickRecords )
        {
        // Create a new connection
        using ( var db = new SQLiteConnection( new SQLitePlatformWinRT(), DbPath ) )
            {
            db.BeginTransaction();
            try
                {
                foreach ( var tickRecord in tickRecords )
                    {
                    if ( tickRecord.Id == 0 )
                        {
                        // New
                        db.Insert( tickRecord );
                        }
                    else
                        {
                        // Update
                        db.Update( tickRecord );
                        }
                    }

                db.Commit();
                }
            catch ( Exception ex )
                {
                db.Rollback();
                }
            }
        }