Unity実装03 SQLiteのCreateTable

いつもありがとうございます。

スキマ時間開発のお時間です。よろしくお願いします。


前回のあらすじ

 ログインの画面を作ったよ!


ということで、今回はログインの処理を作成。の前に、SQLiteのCreate DBとCreate Tableが必要でした。

ユーザ作成のタイミングで、Create DBを実行します。

また、クライアント・サーバー間で問合せする度にバージョンチェックを実行、テーブルのバージョンが異なる場合に、Create Tableを行います。

今回、バージョンは3つの数字から構成します。

 [テーブルバージョン].[ゲームバージョン].[マスタバージョン]

これだけ管理すれば、どんな変更にも耐えられるはず、、、ゲームのデジタルゲームの設計初めてだからよくわからん。

アタマのテーブルバージョンが異なる場合には、テーブル再作成が必要になります。と。


ゲーム起動時点で、Create DB

LoginManager.cs
	void Awake()
	{
		Debug.Log("[CALL] LoginManager.Awake()");
		// SQLiteのCreateDB
		string DBPath = Application.persistentDataPath + "/Service.db";
		if (!File.Exists(DBPath))
		{
			// CREATE DB
			File.Create(DBPath);
			Debug.Log(DBPath);

			// テーブルを作成する
			CommunicationManager.CreateTables();
		}
   ・
   ・
   ・

SQLiteのCreate DBは、DBファイル作成です。

保存場所をマスクなしで晒していますが、すべてのゲーム処理はサーバ実行なので、書き換えされてもバグるだけ。ここからチートとかはできないはず。


テーブル作成は、以前参考にしていた本のやり方だと、Modelクラスを作成してごちゃごちゃしていました。

DBとC#で2重管理は嫌です。(Unityよくわかっていなかったので素直に作成していた過去のワタシ。。。(´;ω;`))

クライアント側だけでもそれなりのテーブル数があるので、個人製作でModelくらすなんぞ作ってられるかい。


テーブルバージョンはそうそう変わらないはずだけど、初めてなので発生頻度が不明すぎる。

というわけで、A5SQLのER図からのCreateTable生成機能で作成したクエリを、直でDQLiteに流し込みたいところ。


まずは、作成したクエリファイルをサーバーに配置。

画像1

このファイルは下手に加工すると事故の元なので、加工なし。

PHPで加工して、クライアントに渡します。

createTables.php

<?php
 // ファイルを変数に格納
 $filename = 'createTables.sql';
 
 // fopenでファイルを開く('r'は読み込みモードで開く)
 $fp = fopen($filename, 'r');
 
 // whileで行末までループ処理
 while (!feof($fp)) {
 
   // fgetsでファイルを読み込み、変数に格納
   $txt = fgets($fp);
   
   // コメント行は読みとばす
   if(strpos($txt, '--') !== 0){
     // ファイルを読み込んだ変数を出力
     echo str_replace('on update CURRENT_TIMESTAMP', ' ', str_replace('CASCADE', ' ', $txt) ).' ';
   }
   
 }
 
 // fcloseでファイルを閉じる
 fclose($fp);
?>

SQLiteのコードにコメント機能を作ってないので、コメント行を削除。

その他、対応していない予約語も次元の間に投げ捨てます。


クライアントのC#(一部)


		//レスポンスを取得
		string txt_response = unityWebRequest.downloadHandler.text;

		// createTable
		try
		{
			SqliteDatabase sqlDB = new SqliteDatabase("Service.db");

			// 読み込んだ文字列をSQL終端文字で配列に格納
			string[] p_querys = txt_response.Split(';');
			for (int n = 0; n < p_querys.Length; n++)
			{
				UnityEngine.Debug.Log("SQL["+ n +"] : " + p_querys[n]);
				// SQL実行
				sqlDB.ExecuteQuery(p_querys[n]);
			}
		}
		catch (IOException e)
		{
			// SQL実行エラー
			UnityEngine.Debug.Log(e.Message);
		}

あとは、SQL終端文字で区切って、愚直にSQLiteに投げればOK。


画像2

よっしゃー。テーブル15個いただきましたー。


次回はサーバからマスタデータをコピーかな。


最後まで読んでいただきありがとうございました。

いいなと思ったら応援しよう!