Unity実装05 サーバーのデータをクライアントにコピー
いつもありがとうございます。
スキマ時間開発のお時間です。よろしくお願いします。
前回までのあらすじ
クライアント側:レスポンス処理のエラーケースをある程度実装したよ!
そろそろゲーム、ゲームっぽい部分に進みたいですが、もう少し基礎を構築していきます。
レスポンス処理の正常系、データの受け渡しです。
以前作成したときは、真面目にテーブルのクラス作って、Unity様標準のJSONライブラリを利用していました。
サーバー側もララベルにテーブル定義していたからまさかの三重管理!(これって一般的なの???)
三重管理なんて根源的恐怖に曝されていたらSAN値直葬なので、DBを正にドライブするよ。
サーバー側。
// バージョンチェック ※全更新のため、バージョンチェックは不要!
// require_once 'chkver.php';
// 取得条件
$FROM = '';
$WHERE = '';
// JSONヘッダ処理
echo '{';
// 種族マスタ
$FROM = 'XXXXXXXXXX';
$WHERE = '0 = 0';
require 'getTable.php';
echo ',';
// 明細マスタ
$FROM = 'XXXXXXXXXX';
$WHERE = '0 = 0';
require 'getTable.php';
// JSONフッタ処理
echo '}';
getTable.php 一部抜粋
// SQLステートメントを実行し、結果を変数に格納
$sql = "SELECT * FROM ".$FROM." WHERE ".$WHERE;
$stmt = $dbh->query($sql);
// 連想配列のみ出力するモード(数値は不要)
$stmt->setFetchMode(PDO::FETCH_ASSOC);
// データセットを出力
echo '"'.$FROM.'":{';
$no = 0;
foreach ($stmt as $row) {
// 最初のみ、区切り文字不要
if ($no !== 0){
echo ',';
}
// JSONにして出力
echo '"'.$no.'":';
echo json_encode($row,JSON_UNESCAPED_UNICODE);
$no++;
}
echo '}';
ポイントは「連想配列のみ出力するモード」。(あとは素直なもの)
受け側はこんな感じ。
// SQLite
SqliteDatabase sqlDB = new SqliteDatabase("Service.db");
// レスポンスがデータのJSONだった場合
LitJson.JsonData p_JsonData = LitJson.JsonMapper.ToObject(txt_response);
foreach(String p_tablenm in p_JsonData.Keys)
{
foreach (String p_rowno in p_JsonData[p_tablenm].Keys)
{
List<string> p_col_list = new List<string>();
List<string> p_val_list = new List<string>();
foreach (String p_colnm in p_JsonData[p_tablenm][p_rowno].Keys)
{
if (p_JsonData[p_tablenm][p_rowno][p_colnm] != null) {
p_col_list.Add(p_colnm);
p_val_list.Add((string)p_JsonData[p_tablenm][p_rowno][p_colnm]);
}
}
// 1レコードずつUPSERT
String p_sql = "REPLACE INTO " + p_tablenm + " ("+ String.Join(",", p_col_list) + ") VALUES (\"" + String.Join("\",\"", p_val_list) + "\");";
sqlDB.ExecuteQuery(p_sql);
}
}
ポイントは、テーブル名、行番号、項目名を決め打ちで取得するところ。
他のツリー構造のJSONが来たらアウト。
それでも、C#にもphpにもテーブル構造持つよりはよっぽどセーフティーだと思うだけど。
上記みたいなサンプルコードはwebで見つけられませんでした。(そんな変な方針何だろうか。。。超不安。)
クライアント側のマスタでもデータが入るようになりました。
そろそろユーザ登録したい。。。
最後まで読んでいただきありがとうございました。
この記事が気に入ったらサポートをしてみませんか?