【发布时间】:2016-06-02 05:28:14
【问题描述】:
以前我使用 SQLITE-NET 库来完成我所有的 sqlite 数据库任务,它运行良好。 但是我的应用程序要插入大量数据,并且花费了很多时间。所以我决定只在需要批量插入的情况下使用 SQLITE-WinRT 包装器,因为 SQLITE-WinRT 包装器似乎提供了准备语句然后绑定数据然后执行它们这样的功能,这可以加快处理速度并提高性能。
在我的应用程序中,有很多使用 SQLITE-NET 方法的 CRUD 操作,我保留原样,因为很难从 SQLITE-NET 库完全切换到 SQLITE-WinRT 包装器。
我的应用有后台任务,它只使用 SQLITE-NET 库运行和处理一些 Web 服务调用和大量 CRUD 操作。
每当我尝试使用准备好的语句使用 SQLITE-WinRT 包装器进行批量插入时,如果后台任务正在运行,它总是会在 SQLITE-NET 库中引发 Busy 异常。我知道它的原因,后台服务使用 SLITE-NET 库进行了大量的 CRUD 操作。因此,当使用 SQLITE-WinRT 包装器进行批量插入时,它会引发 Busy 异常,因为 sqlite 数据库已经在使用 SQLITE-NET 在后台执行大量任务。
所以,我的问题是如何处理这种情况。请建议我一些处理此类案件的想法。我想到了两个想法:
- 批量插入时停止后台服务(在后台, 有一系列漫长的任务,比如调用网络服务和做工作 使用 SQLite db,可能不会立即停止后台服务 好主意)
- 关闭所有 SQLITE-NET 连接(但未按预期工作)
任何帮助将不胜感激。提前致谢。
在批量插入时,我是这样开始的:
string dbPath = "collection.sqlite";
var file = await ApplicationData.Current.LocalFolder.GetFileAsync(dbPath);
var db = new SQLiteWinRT.Database(file);
await db.OpenAsync(SqliteOpenMode.OpenReadWrite);
using (var statement = await db.PrepareStatementAsync("INSERT INTO Forms(ServerFormId,FormFileName,FormStatusId,PriorityId) VALUES(?,?,?,?)"))
{
await db.ExecuteStatementAsync("BEGIN TRANSACTION");
statement.Reset();
statement.BindTextParameterAt(1, "0");
statement.BindTextParameterAt(2, formName);
statement.BindTextParameterAt(3, formStatusId);
statement.BindTextParameterAt(4, priorityId);
await statement.StepAsync().AsTask().ConfigureAwait(false);
}
await db.ExecuteStatementAsync("COMMIT TRANSACTION");
SQLite-WinRT:https://blogs.msdn.microsoft.com/andy_wigley/2013/11/21/how-to-massively-improve-sqlite-performance-using-sqlwinrt/
SQLite-net:http://www.codeproject.com/Articles/826602/Using-SQLite-as-local-database-with-Universal-Apps
【问题讨论】:
标签: windows sqlite windows-runtime win-universal-app sqlite-net