תרגיל: השתמש בפונקציה SQLite באופן אסינכרוני

הושלמה

היישום פועל היטב, אך אם מסד הנתונים מכיל שורות רבות, ממשק המשתמש יכול להפסיק להגיב בזמן שהיישום מבצע שאילתות מסד נתונים ופעולות אחרות. בתרגיל זה, תמיר את היישום מה- API הסינכרוני SQLite לגירסה האסינכרונית. בדרך זו, היישום שלך תמיד מגיב ללא קשר למספר השאילתות שתבצע במסד הנתונים.

יצירת חיבור אסינכרוני

  1. פתח את PersonRepository.cs הקובץ בחלון אנשים זה.

  2. שנה את Init של פעולת השירות הבאה כך שהיא async. שנה את סוג ההחזרה של פעולת השירות ל- Task.

  3. שנה conn המאפיין SQLiteAsyncConnection ועדכן את הקוד בפעולת השירות Init שאתחול החיבור.

  4. החלף את השיחה בפעולת השירות CreateTable הסינכרונית בפעולת השירות CreateTableAsync הסינכרון.

    הקוד שהושלם אמור להיראות כך:

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

הוספת פריט לטבלה באופן אסינכרוני

  1. שנה את ההגדרה של פעולת AddNewPerson הבאה כך שלא async. שנה את סוג ההחזרה של פעולת השירות ל- Task.

  2. הוסף את await המפתח הבאה Init זו מכיוון Init היא כעת שיטת async אישית.

  3. עדכן AddNewPerson השירות הבאה כדי להוסיף Person חדשה באמצעות פעולת הוספה אסינכרונית.

    הקוד אמור להיראות כך:

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

קבלת כל הפריטים מטבלה באופן אסינכרוני

  1. שנה את GetAllPeople פעולת השירות. פעולת שירות זו צריכה להיות async ולהחזיר אובייקט Task<List<Person>> אחר.

  2. הוסף את await המפתח הבאה Init זו.

  3. עדכן את פעולת השירות כדי להחזיר את התוצאות באמצעות קריאה אסינכרונית.

    הקוד אמור להיראות כך:

    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. שמור את PersonRepository.cs הקובץ.

בדיקת הפונקציונליות הסינכרונית

  1. הרחב MainPage.xaml בסייר הפתרונות ופתח את MainPage.xaml.cs הקובץ.

  2. שנה את שני המטפלים באירועים בלחיצה על הלחצן כך שהם ישתמשו בפעולות שירות אסינכרוניות מהמחלקה PersonRepository הסינכרון. השתמש במילות המפתח asyncawait הבאות:

      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. שמור את MainPage.xaml.cs הקובץ.

  4. בנה והפעל את התוכנית ב- Windows וב- Android, וודא שהיא עדיין פועלת כמו בעבר.