Oefening: SQLite asynchroon gebruiken

Voltooid

De toepassing werkt goed, maar als de database veel rijen bevat, kan de gebruikersinterface niet meer reageren terwijl de app databasequery's en andere bewerkingen uitvoert. In deze oefening converteert u de toepassing van de synchrone SQLite-API naar de asynchrone versie. Op deze manier reageert uw toepassing altijd, ongeacht het aantal query's dat u in uw database maakt.

Een Asynchrone verbinding maken

  1. Open het PersonRepository.cs-bestand in het project Personen .

  2. Wijzig de definitie van de Init methode in .async Wijzig het retourtype van de methode in Task.

  3. Wijzig de conn eigenschap in een SQLiteAsyncConnection en werk de code bij in de Init methode waarmee de verbinding wordt geïnitialiseerd.

  4. Vervang de aanroep naar de synchrone CreateTable methode door de asynchrone CreateTableAsync methode.

    De voltooide code moet er als volgt uitzien:

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

Een item asynchroon invoegen in een tabel

  1. Wijzig de definitie van de AddNewPerson methode die moet worden asyncgebruikt. Wijzig het retourtype van de methode in Task.

  2. Voeg het await trefwoord toe aan de Init methodeaanroep omdat dit Init nu een async methode is.

  3. Werk de AddNewPerson methode bij om een nieuwe Person in te voegen met behulp van een asynchrone invoegbewerking.

    De code moet er als volgt uitzien:

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

Alle items asynchroon uit een tabel ophalen

  1. Wijzig de GetAllPeople methodedefinitie. Deze methode moet een object zijn async en retourneren Task<List<Person>> .

  2. Voeg het await trefwoord toe aan de Init methode-aanroep.

  3. Werk de methode bij om de resultaten te retourneren met behulp van een asynchrone aanroep.

    De code moet er als volgt uitzien:

    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. Sla het PersonRepository.cs bestand op.

De asynchrone functionaliteit testen

  1. Vouw MainPage.xaml uit in Solution Explorer en open het bestand MainPage.xaml.cs .

  2. Wijzig beide gebeurtenis-handlers met de knopklik zodat ze de asynchrone methoden uit de PersonRepository klasse gebruiken. Maak gebruik van de async trefwoorden en await trefwoorden:

      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. Sla het MainPage.xaml.cs bestand op.

  4. Bouw en voer het programma uit op Windows en Android en controleer of het nog steeds werkt zoals voorheen.