Cvičení: Asynchronní použití SQLite
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 je vaše aplikace vždy responzivní bez ohledu na to, kolik dotazů v databázi provedete.
Vytvoření asynchronního připojení
Otevřete soubor PersonRepository.cs v projektu Lidé.
Upravte definici
Init
metody tak, aby bylaasync
. Změňte návratový typ metody naTask
.conn
Změňte vlastnost naSQLiteAsyncConnection
a aktualizujte kód vInit
metodě, která inicializuje připojení.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
Upravte definici
AddNewPerson
metody tak, aby bylaasync
. Změňte návratový typ metody naTask
.await
Přidejte klíčové slovo doInit
volání metody, protožeInit
je teď metodouasync
.Aktualizujte metodu
AddNewPerson
tak, aby vložil novouPerson
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
Upravte definici
GetAllPeople
metody. Tato metoda by měla býtasync
a vrátitTask<List<Person>>
objekt.await
Přidejte klíčové slovo doInit
volání metody.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>(); }
Uložte soubor PersonRepository.cs.
Testování asynchronní funkce
Rozbalte soubor MainPage.xaml v Průzkumník řešení a otevřete soubor MainPage.xaml.cs.
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ýchasync
slov aawait
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; }
Uložte soubor MainPage.xaml.cs.
Sestavte a spusťte program ve Windows a Androidu a ověřte, že stále funguje jako předtím.