异步使用 SQLite
如果以同步方式对数据库运行查询,可能会导致性能问题和应用无响应。 SQLite-net 具有一个异步 API,可用于使应用程序始终保持响应。
本单元将介绍如何使用 SQLite-net 的异步 API 来确保应用程序保持高度响应。
了解异步查询
到目前为止,所做的一切均已在 UI 线程上执行。 但是,若要生成响应速度极快的移动应用程序,需要以略有不同的方式执行操作。 如果在 UI 线程上运行数据库操作,则可能会导致 UI 在操作需要很长时间才能完成时冻结。
为了解决此问题,SQLite-net 通过 SQLiteAsyncConnection
类包含了一个异步 API。 例如,若要异步创建表,可使用 CreateTableAsync
方法:
var conn = new SQLiteAsyncConnection(dbPath);
await conn.CreateTableAsync<User>();
使用 SQLite-net 执行异步操作
SQLiteAsyncConnection
类公开与其同步操作类似的操作。 但是,操作均基于任务,以便在后台使用。
常见的可用异步操作包括:
CreateTableAsync
:根据指示的类创建表DropTableAsync
:删除与指示的类关联的表GetAsync
:获取表中与指示的类关联的记录,并匹配传入构造函数的主键InsertAsync
:使用传入构造函数的项插入新记录UpdateAsync
:使用传入构造函数的项更新现有记录DeleteAsync
:删除表中映射到指示类的记录,并匹配传入构造函数的主键QueryAsync
:运行直接 SQL 查询并返回对象ExecuteAsync
:运行直接 SQL 查询并返回受影响的行数ExecuteScalarAsync
:运行直接 SQL 查询并返回单个结果ToListAsync
:异步执行 Table 方法
以下代码举例说明如何使用 ToListAsync
方法异步检索记录:
SQLiteAsyncConnection conn;
ObservableCollection<User> userList; // Bound to UI
...
public async Task AddAllUsersAsync()
{
List<User> users = await conn.Table<User>().ToListAsync();
// Must be on UI thread here!
foreach (var u in users)
userList.Add(u);
}
在此示例中,ToListAsync
方法可从数据库异步获取所有用户。 如果使用此方法,即使数据库中有大量用户,UI 也能保持响应。