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に流し込みたいところ。
まずは、作成したクエリファイルをサーバーに配置。
このファイルは下手に加工すると事故の元なので、加工なし。
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。
よっしゃー。テーブル15個いただきましたー。
次回はサーバからマスタデータをコピーかな。
最後まで読んでいただきありがとうございました。