Exercice : Utiliser SQLite de façon asynchrone
L’application fonctionne bien, mais si la base de données contient de nombreuses lignes, l’interface utilisateur peut cesser de répondre pendant que l’application effectue des requêtes de base de données et d’autres opérations. Dans cet exercice, vous convertissez l’application de l’API SQLite synchrone en version asynchrone. Ainsi, notre application est toujours réactive, quel que soit le nombre de requêtes que vous effectuez sur votre base de données.
Créer une connexion asynchrone
Ouvrez le fichier PersonRepository.cs dans le projet People.
Modifiez la définition de la méthode
Init
pour qu’elle devienneasync
. Remplacez le type de retour de la méthode parTask
.Remplacez la propriété
conn
parSQLiteAsyncConnection
et mettez à jour le code dans la méthodeInit
qui initialise la connexion.Remplacez l’appel à la méthode
CreateTable
synchrone par la méthodeCreateTableAsync
asynchrone.Le code final doit se présenter comme suit :
private SQLiteAsyncConnection conn; private async Task Init() { if (conn != null) return; conn = new SQLiteAsyncConnection(_dbPath); await conn.CreateTableAsync<Person>(); }
Insérer un élément dans une table de façon asynchrone
Modifiez la définition de la méthode
AddNewPerson
pour qu’elle soitasync
. Remplacez le type de retour de la méthode parTask
.Ajoutez le mot clé
await
à l’appel de méthodeInit
, carInit
est désormais une méthodeasync
.Mettez à jour la méthode
AddNewPerson
pour insérer un nouvel élémentPerson
avec une opération d’insertion asynchrone.Le code doit se présenter comme ceci :
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); } }
Obtenir tous les éléments d’une table de façon asynchrone
Modifiez la définition de méthode
GetAllPeople
. Cette méthode doit êtreasync
et retourner un objetTask<List<Person>>
.Ajoutez le mot clé
await
à l’appel de méthodeInit
.Mettez à jour la méthode pour retourner les résultats en utilisant un appel asynchrone.
Le code doit se présenter comme ceci :
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>(); }
Enregistrez le fichier PersonRepository.cs.
Tester la fonctionnalité asynchrone
Développez MainPage.xaml dans l’Explorateur de solutions et ouvrez le fichier MainPage.xaml.cs.
Modifiez les deux gestionnaires d’événements d’un clic de bouton pour qu’ils utilisent les méthodes asynchrones de la classe
PersonRepository
. Utilisez les mots clésasync
etawait
: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; }
Ouvrez le fichier MainPage.xaml.cs.
Générez et exécutez le programme sur Windows et Android, en vérifiant qu’il fonctionne toujours comme avant.