Cvičení: Asynchronní použití SQLite

Dokončeno

Aplikace funguje dobře, ale pokud databáze obsahuje mnoho řádků, uživatelské rozhraní může přestat reagovat, zatímco aplikace provádí databázové dotazy a další operace. V tomto cvičení převedete aplikaci z synchronního rozhraní API SQLite na asynchronní verzi. Díky tomu bude vaše aplikace vždy reagovat bez ohledu na to, kolik dotazů v databázi provedete.

Vytvoření asynchronního připojení

  1. Otevřete soubor PersonRepository.cs v projektu Lidé.

  2. Upravte definici Init metody tak, aby byla async. Změňte návratový typ metody na Task.

  3. conn Změňte vlastnost na SQLiteAsyncConnection a aktualizujte kód v Init metodě, která inicializuje připojení.

  4. Nahraďte volání synchronní CreateTable metody asynchronní CreateTableAsync metodou.

    Hotový kód by měl vypadat takto:

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

Asynchronní vložení položky do tabulky

  1. Upravte definici AddNewPerson metody tak, aby byla async. Změňte návratový typ metody na Task.

  2. await Přidejte klíčové slovo do Init volání metody, protože Init je teď metodouasync.

  3. Aktualizujte metodu AddNewPerson tak, aby vložil novou Person pomocí asynchronní operace vložení.

    Kód by měl vypadat takto:

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

Asynchronní získání všech položek z tabulky

  1. Upravte definici GetAllPeople metody. Tato metoda by měla být async a vrátit Task<List<Person>> objekt.

  2. await Přidejte klíčové slovo do Init volání metody.

  3. Aktualizujte metodu tak, aby vrátila výsledky pomocí asynchronního volání.

    Kód by měl vypadat takto:

    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. Uložte soubor PersonRepository.cs.

Testování asynchronní funkce

  1. Rozbalte soubor MainPage.xaml v Průzkumník řešení a otevřete soubor MainPage.xaml.cs.

  2. Upravte oba obslužné rutiny událostí kliknutí na tlačítko tak, aby používaly asynchronní metody z PersonRepository třídy. Použití klíčových async slov a await klíčových slov:

      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. Uložte soubor MainPage.xaml.cs.

  4. Sestavte a spusťte program ve Windows a Androidu, abyste ověřili, že stále funguje jako předtím.