Exercício: Usar o SQLite de maneira assíncrona
O aplicativo funciona bem, mas se o banco de dados contiver muitas linhas, a interface do usuário poderá ficar sem resposta enquanto o aplicativo executa consultas de banco de dados e outras operações. Neste exercício, você converterá o aplicativo da API Síncrona do SQLite para a versão assíncrona. Assim, seu aplicativo será sempre responsivo, independentemente de quantas consultas você fizer ao banco de dados.
Criar uma conexão assíncrona
Abra o arquivo PersonRepository.cs no projeto Pessoas.
Modifique a definição
Init
do método para serasync
. Altere o tipo de retorno do método paraTask
.Altere a propriedade
conn
para umSQLiteAsyncConnection
e atualize o código no métodoInit
que inicializa a conexão.Substitua a chamada para o método síncrono
CreateTable
pelo método assíncronoCreateTableAsync
.O script concluído deverá ter esta aparência:
private SQLiteAsyncConnection conn; private async Task Init() { if (conn != null) return; conn = new SQLiteAsyncConnection(_dbPath); await conn.CreateTableAsync<Person>(); }
Inserir um item em uma tabela de maneira assíncrona
Modifique a definição do método
AddNewPerson
para serasync
. Altere o tipo de retorno do método paraTask
.Adicione a palavra-chave
await
à chamada de métodoInit
porqueInit
agora é um métodoasync
.Atualize o método
AddNewPerson
para inserir um novoPerson
usando uma operação de inserção assíncrona.Seu código deve ficar assim:
using System.Threading.Tasks; ... public async Task AddNewPerson(string name) { int result = 0; try { // Call Init() await Init(); // basic validation to ensure a name was entered if (string.IsNullOrEmpty(name)) throw new Exception("Valid name required"); result = await conn.InsertAsync(new Person { Name = name }); StatusMessage = string.Format("{0} record(s) added [Name: {1})", result, name); } catch (Exception ex) { StatusMessage = string.Format("Failed to add {0}. Error: {1}", name, ex.Message); } }
Obter todos os itens de uma tabela de maneira assíncrona
Modifique a definição do método
GetAllPeople
. Esse método deve serasync
e retornar um objetoTask<List<Person>>
.Adicione a palavra-chave
await
à chamada de métodoInit
.Atualize o método para retornar os resultados usando uma chamada assíncrona.
Seu código deve ficar assim:
public async Task<List<Person>> GetAllPeople() { try { await Init(); return await conn.Table<Person>().ToListAsync(); } catch (Exception ex) { StatusMessage = string.Format("Failed to retrieve data. {0}", ex.Message); } return new List<Person>(); }
Salve o arquivo PersonRepository.cs.
Testar a funcionalidade assíncrona
Expanda MainPage.xaml no Gerenciador de Soluções e abra o arquivo MainPage.xaml.cs.
Modifique ambos os manipuladores de eventos de clicar com o botão para que eles usem os métodos assíncronos da classe
PersonRepository
. Use as palavras-chaveasync
eawait
:public async void OnNewButtonClicked(object sender, EventArgs args) { statusMessage.Text = ""; await App.PersonRepo.AddNewPerson(newPerson.Text); statusMessage.Text = App.PersonRepo.StatusMessage; } public async void OnGetButtonClicked(object sender, EventArgs args) { statusMessage.Text = ""; List<Person> people = await App.PersonRepo.GetAllPeople(); peopleList.ItemsSource = people; }
Salve o arquivo MainPage.xaml.cs.
Crie e execute o programa no Windows e no Android, verificando se ele ainda funciona como antes.