MRが楽しい

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

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

本日は SQLite の技術調査枠です。
Unity プロジェクトで SQLite のバイナリファイルから SQL 文を使ってデータを取得する方法を記事にします。

SQLite-netのライブラリを取得する

今回は SQLite 利用のため、Unity に SQLite-net のライブラリを取得して利用します。
SQLite-net の取得には NuGetForUnity を利用しました。
github.com

ダウンロードしたパッケージを Unity プロジェクトにインポートします。

メニューから[NuGet -> Manage NuGet Packages]を開き、[SQLite-net]を検索します。
SQLite-net のライブラリを選択して[Install]します。

SQLite-net は sqlite3 のライブラリを参照するので以下のサイトから対象プラットフォームの sqlite3.dll を取得します。
www.sqlite.org

今回は Windows 環境で動作確認を行うので[Precompiled Binaries for Windows]項の[sqlite-dll-win64-x64-XXX.zip]を取得しました。

プロジェクトに Plugins フォルダを作成し、sqlite3.dll をコピーしました。これで利用準備は完了です。

サンプルコード

実際にサンプルコードを書いて動作確認をしてみます。
sqlite3 のデータには前回記事で作成したデータファイルにカラムを追加したものを利用しました。
bluebirdofoz.hatenablog.com

以下のテーブルのカラムフォーマットを示すクラスと、SQL 文を使ってファイルから情報を取得するアクセスクラスを作成しました。
・PersonColumnFormat.cs

using SQLite;

public class PersonColumnFormat
{
    [Preserve]
    public int id { get; set; }

    [Preserve]
    public string name{ get; set; }
}

・SQLConnectionForPersonTable.cs

using System.Collections;
using System.Collections.Generic;
using SQLite;
public class SQLConnectionForPersonTable
{
    private SQLiteConnection db;

    public SQLConnectionForPersonTable(string propertyFilePath)
    {
        db = new SQLiteConnection(propertyFilePath);
    }

    /// <summary>
    /// 全ての人物情報を取得する
    /// 
    public IReadOnlyList<PersonColumnFormat> GetPersonDataAll()
    {
        List<PersonColumnFormat> result = db.Query<PersonColumnFormat>(SelectPersonTableSql);

        return result;
    }

    /// <summary>
    /// 名前を元に関連する人物情報を取得する
    /// 
    public IReadOnlyList<PersonColumnFormat> GetPersonDataByName(string a_Name)
    {
        List<PersonColumnFormat> result = db.Query<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 SelectDataTest : MonoBehaviour
{
    [ContextMenu("GetPersonAll")]
    public void GetPersonAll()
    {
        string path = System.IO.Path.Combine(Application.streamingAssetsPath, "test.sqlite3");
        SQLConnectionForPersonTable sql = new SQLConnectionForPersonTable(path);
        IReadOnlyList<PersonColumnFormat> sqlResult = sql.GetPersonDataAll();

        foreach(PersonColumnFormat column in sqlResult)
        {
            Debug.Log($"GetAllPerson : id = {column.id}, name = {column.name}");
        }
    }

    [ContextMenu("GetPersonHoloMon")]
    public void GetPersonHoloMon()
    {
        string path = System.IO.Path.Combine(Application.streamingAssetsPath, "test.sqlite3");
        SQLConnectionForPersonTable sql = new SQLConnectionForPersonTable(path);
        IReadOnlyList<PersonColumnFormat> sqlResult = sql.GetPersonDataByName("Holomon");

        foreach (PersonColumnFormat column in sqlResult)
        {
            Debug.Log($"GetAllPerson : id = {column.id}, name = {column.name}");
        }
    }
}

データベースファイルを StreamingAssets にコピーして準備は完了です。

動作確認

コンテキストメニューから関数を実行して動作を確認します。
以下の通り、SQLite のバイナリファイルに対して SQL 文を実行してカラムデータを取得できました。
・全データを取得する

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