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 クエリを実行し、1 つの結果を返します

  • 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 の応答性が保たれます。