Exercice : Utiliser SQLite de façon asynchrone

Effectué

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

  1. Ouvrez le fichier PersonRepository.cs dans le projet People.

  2. Modifiez la définition de la méthode Init pour qu’elle devienne async. Remplacez le type de retour de la méthode par Task.

  3. Remplacez la propriété conn par SQLiteAsyncConnection et mettez à jour le code dans la méthode Init qui initialise la connexion.

  4. Remplacez l’appel à la méthode CreateTable synchrone par la méthode CreateTableAsync 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

  1. Modifiez la définition de la méthode AddNewPerson pour qu’elle soit async. Remplacez le type de retour de la méthode par Task.

  2. Ajoutez le mot clé await à l’appel de méthode Init, car Init est désormais une méthode async.

  3. Mettez à jour la méthode AddNewPerson pour insérer un nouvel élément Person 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

  1. Modifiez la définition de méthode GetAllPeople. Cette méthode doit être async et retourner un objet Task<List<Person>>.

  2. Ajoutez le mot clé await à l’appel de méthode Init.

  3. 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>();
    }
    
  4. Enregistrez le fichier PersonRepository.cs.

Tester la fonctionnalité asynchrone

  1. Développez MainPage.xaml dans l’Explorateur de solutions et ouvrez le fichier MainPage.xaml.cs.

  2. 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és async et await :

      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;
      }
    
  3. Ouvrez le fichier MainPage.xaml.cs.

  4. Générez et exécutez le programme sur Windows et Android, en vérifiant qu’il fonctionne toujours comme avant.