Übung: Asynchrones Verwenden von SQLite

Abgeschlossen

Die Anwendung funktioniert gut, wenn aber die Datenbank viele Zeilen enthält, kann die Benutzeroberfläche nicht mehr reagieren, während die App Datenbankabfragen und andere Vorgänge ausführt. In dieser Übung konvertieren Sie die Anwendung von der synchronen SQLite-API in die asynchrone Version. Dadurch bleibt Ihre Anwendung immer reaktionsfähig, unabhängig davon, wie viele Abfragen an die Datenbank gesendet werden.

Erstellen einer asynchronen Verbindung

  1. Öffnen Sie die Datei PersonRepository.cs im Projekt Personen.

  2. Ändern Sie die Definition der Init-Methode so, dass sie async ist. Ändern Sie den Rückgabetyp der Methode in Task.

  3. Ändern Sie die conn-Eigenschaft in einen SQLiteAsyncConnection, und aktualisieren Sie den Code in der Init-Methode, welche die Verbindung initialisiert.

  4. Ersetzen Sie den Aufruf der synchronen CreateTable-Methode durch die asynchrone CreateTableAsync-Methode.

    Der vollständige Code sollte wie folgt aussehen:

    private SQLiteAsyncConnection conn;
    
    private async Task Init()
    {
        if (conn != null)
            return;
    
        conn = new SQLiteAsyncConnection(_dbPath);
    
        await conn.CreateTableAsync<Person>();
    }
    

Asynchrones Einfügen eines Elements in eine Tabelle

  1. Ändern Sie die Definition der AddNewPerson-Methode in async. Ändern Sie den Rückgabetyp der Methode in Task.

  2. Fügen Sie das await-Schlüsselwort zum Init-Methodenaufruf hinzu, da Init jetzt eine async-Methode ist.

  3. Aktualisieren Sie die AddNewPerson-Methode, um eine neue Person einzufügen, indem Sie einen asynchronen Einfügevorgang verwenden.

    Der Code sollte wie folgt aussehen:

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

Asynchrones Abrufen aller Elemente einer Tabelle

  1. Ändern Sie die GetAllPeople-Methodendefinition. Diese Methode sollte ein async-Objekt sein und ein Task<List<Person>>-Objekt zurückgeben.

  2. Fügen Sie das await-Schlüsselwort zum Init-Methodenaufruf hinzu.

  3. Aktualisieren Sie die Methode so, dass die Ergebnisse mithilfe eines asynchronen Aufrufs zurückgegeben werden.

    Der Code sollte wie folgt aussehen:

    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. Speichern Sie die Datei PersonRepository.cs.

Testen der asynchronen Funktionalität

  1. Erweitern Sie MainPage.xaml im Projektmappen-Explorer, und öffnen Sie die Datei MainPage.xaml.cs.

  2. Ändern Sie beide Schaltflächenklick-Ereignishandler so, dass sie die asynchronen Methoden aus der PersonRepository-Klasse verwenden. Verwenden Sie dazu die Schlüsselwörter async und 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. Speichern Sie die Datei MainPage.xaml.cs.

  4. Erstellen Sie das Programm unter Windows und Android, und führen Sie es unter diesen Betriebssystemen auch aus, um zu überprüfen, ob es weiterhin wie zuvor funktioniert.