연습: 비동기식으로 SQLite 사용

완료됨

애플리케이션은 잘 작동하지만 데이터베이스에 많은 행이 포함된 경우 앱이 데이터베이스 쿼리 및 기타 작업을 수행하는 동안 UI가 응답하지 않게 될 수 있습니다. 이 연습에서는 동기 SQLite API에서 비동기 버전으로 애플리케이션을 변환합니다. 이렇게 하면 데이터베이스에 작성하는 쿼리 수에 관계 없이 애플리케이션이 응답성을 항상 유지할 수 있습니다.

비동기 연결 만들기

  1. People 프로젝트에서 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 클래스의 비동기 메서드를 사용하도록 button-click 이벤트 처리기를 둘 다 수정합니다. 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에서 프로그램을 빌드하고 실행하여 이전과 같이 계속 작동하는지 확인합니다.