- 数多あるSQLiteUnityKitの改修のひとつです。
- リポジトリ (GitHub)
- 日本語が使えるようにしました。
- トランザクション処理に対応しました。
- バインド変数に対応しました。
- 既存DBを上書きしないようにしました。(かといって、マージもしません。)
- オープンやクローズ、リソースの開放などといった低レベル処理は隠蔽して、抽象化レベルの高い処理だけを表に出すようにしました。
- できるだけ例外は内部で捉えて、リソースの未解放を避けて動き続けるように務めました。
- このライブラリは直にSQLを使います。O/Rマッパーが必要な場合は、SQLite-net (GitHub) や、Microsoft.EntityFrameworkCore.Sqlite (nuget) などをご検討ください。
- さっぱり分かっていませんが、標準ライブラリだけで実現することも可能なようです。
- Unity 2022.3.51f1 (LTS)
- SQlite 3.41.0
- Target PF: Windows、macOS、Android、iOS
- SQLiteは、SQLのサブセットが使えるスタンドアローンなデータベース管理システムです。
- 公式サイト
- SQLite3のためのSQLリファレンス (Qiita)、(Zenn)
- SQLiteUnityKitは、UnityからSQLiteを使用するためのフレームワークです。
- リポジトリ (GitHub)
Package Manager
でAdd package from git URL...
から、以下のURLを入力します。
https://github.com/tetr4lab/SQLiteUnityKit.git?path=/Assets/SQLite
Assets/Plugins/sqlite3/
- 各プラットフォーム向けのSQLiteプラグインです。(iOSはOS側でサポートがあります。)
Assets/Scripts/
SQLiteUnity.cs
- 必須部分です。
SQLiteUnityUtility.cs
- 拡張ユーティリティクラスです。必要に応じてお使いください。
- トランザクションでも擬似的なバインドが使えるようになっています。
Startup.cs
- デモ用のローダです。
SQLiteTest.cs
- デモ用スクリプトです。
- Test 1: ゲームっぽい関係性のあるデータ
- Test 2: シンプルで多めのデータ
- Test 3: SQL学習型じゃんけん (Qiita)
ScrollTest.cs
- デモ用スクリプトです。多数のデータをスクロールさせます。
- 仮想スクロールレクト (GitHub)
Assets/Resources/Prefabs/Canvas1.prefab
- デモ用プレハブです。
Assets/Resources/Prefabs/Canvas2.prefab
- デモ用プレハブです。
Assets/Resources/Prefabs/Item.prefab
Canvas2
で使用します。
Assets/Scenes/SQLite_Test.unity
- デモ用シーンです。
- 公式サイトのダウンロードから最新版を取ってきて
Assets/Plugins
へ導入してください。 - Androidについては、こちらの記事(Qiita)を参考にしてください。
- データベース
public class SQLite<TTable, TRow> : IDisposable where TTable : SQLiteTable<TRow>, new () where TRow : SQLiteRow, new ()
SQLiteTable<SQLiteRow>
、または、その派生クラスを使います。
- 新規生成
public SQLite (string dbName, string query = null, string path = null, bool force = false)
- 初期化クエリを指定します。
- データベースファイルが既存なら何もせずそのまま使います。
Application.streamingAssetsPath
に同盟ファイルがあればコピーして使います。
- 単文を実行
public void ExecuteNonQuery (string query, TRow param = null)
- 単文を実行して結果を返す
public TTable ExecuteQuery (string query, TRow param = null)
- 単文の変数を差し替えながら順に実行
public void ExecuteNonQuery (string query, TTable param)
- 同じSQL文を、パラメータを変えながら繰り返し実行します。
- 複文を一括実行し、誤りがあれば巻き戻す
public bool TransactionQueries (IEnumerable<string> query)
public bool TransactionQueries (string query)
- 複数行を配列やリストで渡すか、単一文字列として渡すか、という違いです。
- 冒頭と末尾に
BEGIN
,COMMIT
が勝手に付きます。
- 基底行列データ
public class SQLiteTable<TRow> where TRow : SQLiteRow, new ()
SQLiteRow
、または、その派生クラスを使います。
- クエリで返されるデータで、列の定義と行データの集合です。
- 基底行データ / バインドパラメータ
public class SQLiteRow : Dictionary<string, object>
- 1行分のデータで、列データの集合です。バインドパラメータを渡すときにも使います。
- 拡張バインド (トランザクション用)
public static string SQLiteBind (this string query, SQLiteRow param)
- sqliteの外側で行われる文字列ベースのバインド(単なる文字列置換)です。
- ご指摘やご提案、あるいはご質問などを歓迎します。
- 常識的なことも理解していないので、何か間違えているような場合はご助言いただけると助かります。
- 以下、ほんのさわりだけ紹介します。
- 冒頭で触れた「SQLite-net」の古いバージョンのようです。
- 偶然発見したので、これがどういう意味を持つのかは理解していません。
- Unity 6000.0.24f1
- 新規プロジェクトを生成しただけです。
- 以下のスクリプトをシーンの空オブジェクトにアタッチするだけで、クエリの結果がクラスにマッピングできました。
using System;
using System.IO;
using UnityEngine;
using Unity.VisualScripting.Dependencies.Sqlite;
public class Startup : MonoBehaviour {
void Start () {
var path = Path.Combine (Application.persistentDataPath, "SQLiteTest.db");
using (var connection = new SQLiteConnection (path)) {
var data = connection.Query<TestData> ("select * from Test;");
Debug.Log (string.Join ("\n", data.ConvertAll (i => i.ToString ())));
}
}
}
public class TestData {
public int Serial { get; set; }
public Guid Guid { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Lable { get; set; }
public string Check { get; set; }
public decimal? Width { get; set; }
public decimal? Height { get; set; }
public DateTime? Created { get; set; }
public DateTime? Modified { get; set; }
public override string ToString ()
=> $"{Serial}: {Guid}, '{Title}', '{Description}', '{Lable}', '{Check}', {Width}, {Height}, {Created}, {Modified} ";
}