Latihan: Menggunakan SQLite secara asinkron

Selesai

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

  1. Buka file PersonRepository.cs di proyek Sosial.

  2. Init Ubah definisi metode menjadi async. Mengubah tipe pengembalian metode menjadi Task.

  3. conn Ubah properti menjadi SQLiteAsyncConnection dan perbarui kode dalam Init metode yang menginisialisasi koneksi.

  4. Ganti panggilan ke metode sinkron CreateTable dengan metode asinkron CreateTableAsync .

    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

  1. Ubah definisi metode menjadi AddNewPersonasync. Mengubah tipe pengembalian metode menjadi Task.

  2. await Tambahkan kata kunci ke Init panggilan metode karena Init sekarang async merupakan metode.

  3. AddNewPerson Perbarui metode untuk menyisipkan yang baru Person 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

  1. GetAllPeople Ubah definisi metode. Metode ini harus menjadi async dan mengembalikan objek Task<List<Person>>.

  2. await Tambahkan kata kunci ke Init panggilan metode.

  3. 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>();
    }
    
  4. Simpan file PersonRepository.cs.

Menguji fungsionalitas asinkron

  1. Perluas MainPage.xaml di Penjelajah Solusi dan buka file MainPage.xaml.cs.

  2. Ubah kedua penanganan aktivitas klik tombol untuk menggunakan metode asinkron dari PersonRepository kelas . Manfaatkan kata kunci async dan 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. Simpan file MainPage.xaml.cs.

  4. Bangun dan jalankan program di Windows dan Android untuk memverifikasi bahwa program masih berfungsi seperti sebelumnya.