Usar o SQLite de maneira assíncrona

Concluído

Se você executar consultas em um banco de dados de modo síncrono, isso poderá causar problemas de desempenho e aplicativos sem resposta. O SQLite-net tem uma API assíncrona que pode ser usada para manter o aplicativo responsivo.

Nesta unidade, você aprenderá a usar a API assíncrona do SQLite-net para verificar se o seu aplicativo continua altamente responsivo.

Noções básicas sobre consultas assíncronas

Até aqui, tudo o que você fez foi executado no thread de interface do usuário. No entanto, para criar um aplicativo móvel altamente responsivo, você deseja fazer as tarefas um pouco diferente. Se você executar operações de banco de dados no thread da interface do usuário, isso poderá fazer a interface do usuário congelar se a operação levar muito tempo para ser concluída.

Para resolver esse problema, o SQLite.NET inclui uma API assíncrona por meio da classe SQLiteAsyncConnection. Por exemplo, para criar uma tabela de forma assíncrona, você poderia usar o método CreateTableAsync:

var conn = new SQLiteAsyncConnection(dbPath);
await conn.CreateTableAsync<User>();

Executar operações assíncronas com o SQLite-net

A classe SQLiteAsyncConnection expõe operações semelhantes às de sua contraparte síncrona. No entanto, as operações são todas baseadas em tarefas para uso em segundo plano.

As operações assíncronas comuns disponíveis incluem:

  • CreateTableAsync: cria uma tabela baseada em classe indicada

  • DropTableAsync: remove a tabela correlacionada à classe indicada

  • GetAsync: obtém o registro na tabela correlacionada à classe indicada e faz a correspondência com a chave primária passada para o construtor

  • InsertAsync: insere um novo registro usando o item passado para o construtor

  • UpdateAsync: atualiza um registro existente usando o item passado para o construtor

  • DeleteAsync: exclui o registro na tabela mapeada para a classe indicada e faz a correspondência com a chave primária passada para o construtor

  • QueryAsync: executa uma consulta SQL direta e retorna um objeto

  • ExecuteAsync: Executa uma consulta SQL direta e retorna o número de linhas afetadas

  • ExecuteScalarAsync: executa uma consulta SQL direta e retorna o resultado individual

  • ToListAsync: Executa o método Table de forma assíncrona

O seguinte código mostra um exemplo de como usar o método ToListAsync para recuperar registros de forma assíncrona:

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);
}

Neste exemplo, o método ToListAsync busca todos os usuários do banco de dados de modo assíncrono. Se você usar este método, sua interface do usuário permanecerá responsiva mesmo que haja um grande conjunto de usuários no banco de dados.