Övning: Använda SQLite asynkront

Slutförd

Programmet fungerar bra, men om databasen innehåller många rader kan användargränssnittet inte svara medan appen utför databasfrågor och andra åtgärder. I den här övningen konverterar du programmet från det synkrona SQLite-API:et till den asynkrona versionen. På så sätt är ditt program alltid responsivt oavsett hur många frågor du gör i databasen.

Skapa en Async-anslutning

  1. Öppna filen PersonRepository.cs i people-projektet.

  2. Init Ändra metodens definition till async. Ändra returtypen för metoden till Task.

  3. Ändra egenskapen conn till en SQLiteAsyncConnection och uppdatera koden i metoden Init som initierar anslutningen.

  4. Ersätt anropet till den synkrona CreateTable metoden med den asynkrona CreateTableAsync metoden.

    Den färdiga koden bör se ut så här:

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

Infoga ett objekt i en tabell asynkront

  1. Ändra definitionen av AddNewPerson metoden till async. Ändra returtypen för metoden till Task.

  2. Lägg till nyckelordet await i metodanropet Init eftersom Init det nu är en async metod.

  3. AddNewPerson Uppdatera metoden för att infoga en ny Person med hjälp av en asynkron infogningsåtgärd.

    Koden bör se ut så här:

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

Hämta alla objekt från en tabell asynkront

  1. Ändra metoddefinitionen GetAllPeople . Den här metoden ska vara async och returnera ett Task<List<Person>> objekt.

  2. Lägg till nyckelordet await i metodanropet Init .

  3. Uppdatera metoden för att returnera resultatet med hjälp av ett asynkront anrop.

    Koden bör se ut så här:

    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. Spara filen PersonRepository.cs .

Testa asynkrona funktioner

  1. Expandera MainPage.xaml i Solution Explorer och öppna filen MainPage.xaml.cs .

  2. Ändra båda händelsehanterarna med knappklick så att de använder asynkrona metoder från PersonRepository klassen. Använd nyckelorden async och 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. Spara filen MainPage.xaml.cs .

  4. Skapa och kör programmet på Windows och Android och kontrollera att det fortfarande fungerar som tidigare.