前提
- UnityでSQLiteを用いてデータを管理している
- SQLiteの管理には、有料のORMアセットであるSimpleSQLを用いている
- 開発環境で手軽にDBをリセットしたい
- しかし、DBリセットのためにファイルを消してしまうとDBファイルへのインスペクタ参照が外れてしまう
→ DBファイルを消さずにデータベースをリセットする必要が出てきた。
環境
- Unity 2019.2.13f1
- SimpleSQL 2.7.1
- SQLite 3.28.0
- .NET 4.x
方針
モデルクラスを配置しているネームスペースのクラス名を全て取得し、ForEachを回して全てDROP TABLEする
コード
コア部分は以下のとおり。
var q = System.AppDomain.CurrentDomain.GetAssemblies ()
.SelectMany (t => t.GetTypes ())
.Where (t => t.IsClass && t.Namespace == "myDBModels");
dbManager.BeginTransaction ();
q.ToList ().ForEach (t => dbManager.Execute ("DROP TABLE \"?\"", t.Name));
dbManager.Commit ();
間違って実行してしまわないよう、EditorUtility.DisplayDialog(string title, string info, string ok, string cancel)
で、実行可否を出すダイアログを表示する。
また、今回はデバッグ用なので間違っても実機で実行されてしまわないよう、 #if UNITY_EDITOR
を指定する。
public class DBReseter : MonoBehaviour {
public bool ResetDynamicDB = false;
void Start () {
#if UNITY_EDITOR
if (ResetDynamicDB && EditorUtility.DisplayDialog ("Drop Database", "Are you sure delete all data?", "delete", "cancel")) {
var q = System.AppDomain.CurrentDomain.GetAssemblies ()
.SelectMany (t => t.GetTypes ())
.Where (t => t.IsClass && t.Namespace == "Models.DynamicDB");
dbManager.BeginTransaction ();
q.ToList ().ForEach (t => dbManager.Execute ("DROP TABLE \"?\"", t.Name));
dbManager.Commit ();
PlayerPrefs.SetFloat (dynamicDBKey, 0);
}
#endif
}