MRが楽しい

MRやVRについて学習したことを書き残す

UnityプロジェクトでSQLiteのバイナリファイルからSQL文を使ってデータを取得する その2(非同期)

本日は 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 文を非同期に実行してカラムデータを取得できました。
・全データを取得する

・指定のデータを取得する