비동기식으로 SQLite 사용

완료됨

쿼리를 데이터베이스에서 동기식으로 실행하면 성능 문제와 앱이 응답하지 않는 문제가 발생할 수 있습니다. SQLite-net에는 애플리케이션 응답성을 유지하는 데 사용할 수 있는 비동기 API가 있습니다.

이 단원에서는 SQLite-net의 비동기 API를 사용하여 애플리케이션의 응답성을 높게 유지하는 방법을 알아봅니다.

비동기 쿼리 이해

지금까지 수행한 모든 작업은 UI 스레드에서 실행되었습니다. 그러나 응답성이 높은 모바일 애플리케이션을 빌드하려면 작업 방식을 약간 다르게 해야 합니다. UI 스레드에서 데이터베이스 작업을 실행하는 경우 작업을 완료하는 데 시간이 오래 걸리면 UI가 멈출 수 있습니다.

이런 문제를 해결하기 위해 SQLite-net에는 SQLiteAsyncConnection 클래스를 통한 비동기 API가 포함되어 있습니다. 예를 들어 테이블을 비동기식으로 만드는 데 CreateTableAsync 메서드를 사용할 수 있습니다.

var conn = new SQLiteAsyncConnection(dbPath);
await conn.CreateTableAsync<User>();

SQLite-net으로 비동기 작업 수행

SQLiteAsyncConnection 클래스는 동기 작업과 유사한 작업을 노출합니다. 그러나 모두 백그라운드 사용을 위한 태스크 기반 작업입니다.

사용 가능한 일반적인 비동기 작업은 다음과 같습니다.

  • CreateTableAsync: 지정된 클래스를 기반으로 테이블을 만듭니다.

  • DropTableAsync: 지정된 클래스와 상관 관계가 있는 테이블을 삭제합니다.

  • GetAsync: 지정된 클래스와 상관 관계가 있는 테이블의 레코드를 가져와서 생성자에 전달된 기본 키와 매칭합니다.

  • InsertAsync: 생성자에 전달된 항목을 사용하여 새 레코드를 삽입합니다.

  • UpdateAsync: 생성자에 전달된 항목을 사용하여 기존 레코드를 업데이트합니다.

  • DeleteAsync: 지정된 클래스에 매핑된 테이블의 레코드를 삭제하고 생성자에 전달된 기본 키와 매칭합니다.

  • QueryAsync: 직접 SQL 쿼리를 실행하고 개체를 반환합니다.

  • ExecuteAsync: 직접 SQL 쿼리를 실행하고 영향을 받은 행의 수를 반환합니다.

  • ExecuteScalarAsync: 직접 SQL 쿼리를 실행하고 단일 결과를 반환합니다.

  • ToListAsync: Table 메서드를 비동기적으로 실행합니다.

다음 코드는 ToListAsync 메서드를 사용하여 레코드를 비동기적으로 검색하는 방법의 예를 보여줍니다.

SQLiteAsyncConnection conn;
ObservableCollection<User> userList;  // Bound to UI
...
public async Task AddAllUsersAsync()
{
    List<User> users = await conn.Table<User>().ToListAsync();
    // Must be on UI thread here!
    foreach (var u in users)
        userList.Add(u);
}

이 예에서 ToListAsync 메서드는 데이터베이스에서 모든 사용자를 비동기적으로 가져옵니다. 이 메서드를 사용하면 데이터베이스에 다수의 사용자가 있어도 UI 응답성을 유지할 수 있습니다.