SQLiteUnityKit を下敷きにしたライブラリ
数多ある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
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
Assets/Resources/Prefabs/Canvas1.prefab
Assets/Resources/Prefabs/Canvas2.prefab
Assets/Resources/Prefabs/Item.prefab
Assets/Scenes/SQLite_Test.unity
データベース
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の外側で行われる文字列ベースのバインド(単なる文字列置換)です。
ご指摘やご提案、あるいはご質問などを歓迎します。
常識的なことも理解していないので、何か間違えているような場合はご助言いただけると助かります。
【蛇足】 Unity.VisualScripting を使う方法
以下、ほんのさわりだけ紹介します。
冒頭で触れた「SQLite-net 」の古いバージョンのようです。
偶然発見したので、これがどういう意味を持つのかは理解していません。
Unity 6000.0.24f1
新規プロジェクトを生成しただけです。
https://docs.unity3d.com/Packages/com.unity.visualscripting@1.9/api/Unity.VisualScripting.Dependencies.Sqlite.html
以下のスクリプトをシーンの空オブジェクトにアタッチするだけで、クエリの結果がクラスにマッピングできました。
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} " ;
}