我正在开发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
答案 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();
}
}
}