异步使用 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 也能保持响应。