Latihan: Menggunakan SQLite secara asinkron
Aplikasi bekerja dengan baik, tetapi jika database berisi banyak baris, UI dapat menjadi tidak responsif saat aplikasi melakukan kueri database dan operasi lainnya. Dalam latihan ini, Anda akan mengonversi aplikasi dari API SQLite yang sinkron ke versi asinkron. Dengan cara ini, aplikasi Anda akan selalu responsif terlepas dari berapa banyak kueri yang Anda buat ke database Anda.
Membuat koneksi Asinkron
Buka file PersonRepository.cs di proyek Sosial.
Init
Ubah definisi metode menjadiasync
. Mengubah tipe pengembalian metode menjadiTask
.conn
Ubah properti menjadiSQLiteAsyncConnection
dan perbarui kode dalamInit
metode yang menginisialisasi koneksi.Ganti panggilan ke metode sinkron
CreateTable
dengan metode asinkronCreateTableAsync
.Kode yang sudah selesai akan terlihat seperti ini
private SQLiteAsyncConnection conn; private async Task Init() { if (conn != null) return; conn = new SQLiteAsyncConnection(_dbPath); await conn.CreateTableAsync<Person>(); }
Menyisipkan item ke dalam tabel secara asinkron
Ubah definisi metode menjadi
AddNewPerson
async
. Mengubah tipe pengembalian metode menjadiTask
.await
Tambahkan kata kunci keInit
panggilan metode karenaInit
sekarangasync
merupakan metode.AddNewPerson
Perbarui metode untuk menyisipkan yang baruPerson
dengan menggunakan operasi penyisipan asinkron.Kode akan terlihat seperti ini:
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); } }
Dapatkan semua item dari tabel secara asinkron
GetAllPeople
Ubah definisi metode. Metode ini harus menjadiasync
dan mengembalikan objekTask<List<Person>>
.await
Tambahkan kata kunci keInit
panggilan metode.Perbarui metode untuk mengembalikan hasil dengan menggunakan panggilan asinkron.
Kode akan terlihat seperti ini:
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>(); }
Simpan file PersonRepository.cs.
Menguji fungsionalitas asinkron
Perluas MainPage.xaml di Penjelajah Solusi dan buka file MainPage.xaml.cs.
Ubah kedua penanganan aktivitas klik tombol untuk menggunakan metode asinkron dari
PersonRepository
kelas . Manfaatkan kata kunciasync
danawait
: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; }
Simpan file MainPage.xaml.cs.
Bangun dan jalankan program di Windows dan Android untuk memverifikasi bahwa program masih berfungsi seperti sebelumnya.