1
1

More than 3 years have passed since last update.

[UnityC# SimpleSQL SQLite] UnityでSimpleSQLを用いている場合にDBファイルを消さずにDBをリセットする

Posted at

前提

  • 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
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1