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