本日は SQLite の技術調査枠です。
Unity プロジェクトで SQLite のバイナリファイルから SQL 文を使ってデータを取得する方法を記事にします。
今回は処理を非同期で行いたい場合のコードについてです。
前提条件
以下の前回記事の続きです。
bluebirdofoz.hatenablog.com
非同期実行用クラス
SQLite-net の SQLiteAsync 内クラスを利用するとデータベースのアクセス処理を非同期に実行できます。
以下に前回記事のサンプルコードの非同期版を作成してみました。
・PersonColumnFormat.cs
using SQLite; public class PersonColumnFormat { [Preserve] public int id { get; set; } [Preserve] public string name{ get; set; } }
・SQLConnectionForPersonTableAsync.cs
using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using SQLite; public class SQLConnectionForPersonTableAsync { private SQLiteAsyncConnection db; public SQLConnectionForPersonTableAsync(string propertyFilePath) { db = new SQLiteAsyncConnection(propertyFilePath); } /// <summary> /// 全ての人物情報を取得する /// public async Task<IReadOnlyList<PersonColumnFormat>> GetPersonDataAll() { List<PersonColumnFormat> result = await db.QueryAsync<PersonColumnFormat>(SelectPersonTableSql); return result; } /// <summary> /// 名前を元に関連する人物情報を取得する /// public async Task<IReadOnlyList<PersonColumnFormat>> GetPersonDataByName(string a_Name) { List<PersonColumnFormat> result = await db.QueryAsync<PersonColumnFormat>(SelectPersonTableWhareNameSql, a_Name); return result; } #region SQLCommand private const string SelectPersonTableSql = @" SELECT ps.id AS id, ps.name AS name FROM person ps "; private const string SelectPersonTableWhareNameSql = @" SELECT ps.id AS id, ps.name AS name FROM person ps WHERE ps.name = (?) "; #endregion }
前回と同様に以下のテスト用クラスを作成して Inspector のコンテキストメニューからテストを実行できるようにしました。
・SelectDataTest.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SelectDataTestAsync : MonoBehaviour { [ContextMenu("GetPersonAllAsync")] public async void GetPersonAllAsync() { string path = System.IO.Path.Combine(Application.streamingAssetsPath, "test.sqlite3"); SQLConnectionForPersonTableAsync sql = new SQLConnectionForPersonTableAsync(path); IReadOnlyList<PersonColumnFormat> sqlResult = await sql.GetPersonDataAll(); foreach(PersonColumnFormat column in sqlResult) { Debug.Log($"GetAllPerson : id = {column.id}, name = {column.name}"); } } [ContextMenu("GetPersonHoloMonAsync")] public async void GetPersonHoloMonAsync() { string path = System.IO.Path.Combine(Application.streamingAssetsPath, "test.sqlite3"); SQLConnectionForPersonTableAsync sql = new SQLConnectionForPersonTableAsync(path); IReadOnlyList<PersonColumnFormat> sqlResult = await sql.GetPersonDataByName("Holomon"); foreach (PersonColumnFormat column in sqlResult) { Debug.Log($"GetAllPerson : id = {column.id}, name = {column.name}"); } } }
動作確認
コンテキストメニューから関数を実行して動作を確認します。
以下の通り、SQLite のバイナリファイルに対して SQL 文を非同期に実行してカラムデータを取得できました。
・全データを取得する
・指定のデータを取得する