スプシでDBするやーつを作ってみた
■概要
世間がNCMB(ニフクラ)終了でてんやわんや!!!!
いろいろ引っ越し先をみんなが検討しているところ。
なので作ってみました。スプレッドシートでデータベースするやつを。
■メリット
◆とにかく見やすい&編集しやすい
元がスプレッドシートなので、外部からの管理しやすさはDBを圧倒しています。ちょっとしたデータを入力するのもコピペで簡単に行え、レイアウトも自由自在なので外部からDBを俯瞰するのもめちゃくちゃ楽です。
◆設計したクラスでそのまま読み書きできる
NCMBの場合、NCMBObjectというクラスを介さないと読み書きが行えず、データクラスを読み書きしたい場合それの相互変換が必要でした。当DBではジェネリックメソッドでデータクラスをそのまま読み書きできます。
◆UniTask併用(しているともいう
UniTask前提の設計をしているのもありますが、NCMBよりも非同期の処理が楽に行えます。(NCMBでもunitaskとの連携あった記憶があるが忘れた)
◆改造し放題
良くも悪くも開放的なつくりなのでその気になれば改造し放題です。
■デメリット
◆遅い
唯一にして大きな欠点。やはり本場のDBと比べると明確に遅いです。
特定のタイミングで一回取得する程度なら誤差で収まると思いますが、
定期的に読み書きをするケースでは明確にデメリットとして目立ちます。
これはしゃーなしなので、アプリ側でユーザに時間を感じさせない工夫をしましょう。
■利用形態
MITライセンスにしているので自由に使ってください。ぶっちゃけ色々といい加減(特にGASの方)なのでライセンス表記とかもそこまで強要しないです。そもそもこのライブラリ自体UniTaskに乗っかってますし。
■導入の仕方(スプレッドシート側)
以上でスプレッドシート側の準備は完了です!
■導入の仕方(Unity側)
using GasDb;で定義し、各種クラスのメソッドで読み書きを行います。
UniTaskを使用しているので、予めUniTaskの導入が必要です。
◆サンプルスクリプト
using GasDb; // GasDbを扱うため必要
using Cysharp.Threading.Tasks; // UniTaskも必然的に必要に
using System; // [Serializable]が必要なので
[Serializable] // GasDbで扱うにはSerializableかつGasDbObjectBaseを継承
class TestData : GasDbObjectBase
{
public string userName;
public int age;
}
async void Start(){
GasDbSettings.AppUrl = "URL"; // ←のURLに先ほどのアドレスを入れてください
// データの作成
var data = new TestData();
data.userName = "Player1";
data.age = 10;
// 新規データの保存
var objectId = await GasDbWriter.SaveAsync(data, "Sheet1");
// objectIdを用いたデータの読み込み
var loadData1 = await GasDbReader.LoadDataByObjectIdAsync<TestData>("sheet1", objectId);
// データ一覧の読み込み
var query = new GasDbQuery().WhereLessThan("age", 20).OrderByAscending("age");
var loadData2 = await GasDbReader.LoadDataAsync<GasDbSampleData>("sheet1", query);
}
上のスクリプトを適当なMonobehaviourにコピーし実行することで
スプレッドシートに"Sheet1"シートが生成され、レコードが入力されます。
■シートの見方
このような感じでシートが生成されます。
1行目にフィールド名、2行目に型を記述します。
型は現在string、int、float、bool、objectが対応しています。
(objectにはSerializableなclassを入れられ、セルにはjson形式で入ります)
また、A,B,C列はobjectId、createDate、updateDateにしてください。
※スクリプトから生成した場合は自動でこのレイアウトになります。
■リファレンス
以下、GasDbで実装されているメソッドを解説します。最低限の解説です。実際の使い方はサンプルを見たほうが分かりやすいと思います。
◆GasDbSettingsクラス
基本設定を行うクラスです。
・AppUrl
プロパティです。アプリURLを予め代入しておいてください。
◆GasDbWriterクラス
DBへの書き込みを行うクラスです。
メソッドは全て静的です。
・SaveAsync<T>(T target, string sheetName)
書き込み用のUniTaskの静的メソッドです。
targetには書き込みを行いたいデータを指定します。
sheetNameは新規にデータを入れたい場合、シート名を指定してください。
既存のデータの更新を行う場合は省略可能です。
・SaveAsync(string json,string sheetName)
NCMBのエクスポートされたjsonをそのままスプシに移管します。
第一引数に元のjsonデータを、第二引数にシートを記述。
尚、シートには予めテーブルを作る必要があります。
◆GasDbReaderクラス
DBへの読み込みを行うクラスです。
メソッドは全て静的です。
・LoadDataAsyncByObjectId<Type>(string id)
そのobjectIdのレコードを取得します。
Typeにはそのテーブルの型を指定してください。
・LoadDataAsync<Type>()
読み取り用のUniTaskのメソッドです。
指定したクエリに応じてデータを返します。
Typeにはそのテーブルの型を指定してください。
こちらはそのTypeの型の配列で返ります。
◆GasDbQueryクラス
クエリです。いろいろなところで使います。
以下メソッドはチェーンで繋げることができます。
・WhereほにゃららTo
フィルターです。NCMBと使い方は同じです。
・OrderByAscending OrderByDescending
引数のキーでソートします。今のところ条件は一つのみ有効で、重ねた場合は一番後ろのものが適用されます。
◆GasDbUpdaterクラス
DBを直接更新します。なお、各々がローカルに取得しているデータはそのままなので、そのデータとは不整合が起こります。
なのでローカルでは更新しないデータ向けです。
・UpdateSet()
sheetのkey列のセルにvalueの値を書き込みます。
queryで条件を指定することができます。
指定しない場合全てのセルに書き込まれるので注意してください。
・UpdateAdd()
基本的にはUpdateSetと同じですが、こちらは加算減算を行います。
なお、数値以外を指定した時の動作は知らない。
◆GasDbLoggerクラス
ログ管理に特化したクラスです。初回に最後からfirstnumの数だけ読み込み、その後は更新された分をとります。追加された分はPop命令で順次取り出せます。
インスタンスとして扱います。コンストラクタで対象シートと初回読み込み量を指定します。
・FetchAsync
更新を確認します。
・SendAndFetchAsync
レコードを送信します。そのタイミングでサーバからも情報を取得します。
・TryPop
いま持っているものをひとつ出します。
存在する場合はtrueが返り、outにpopしたレコードが格納されます。
■NCMBインポート機能
NCMBからエクスポートしたjsonファイルをインポートする機能が付属しています。NCMBからの移行に活用してください。
1.メニューからGasDb⇒JsonImporterを選択
2.各項目を入力してWriteボタンを押す
とシートが生成されます。
※確認のダイアログが出るのですが、unityeditorのウインドウが変な位置にあると詰みます(一敗) いずれ直すかも すまぬ
※いちいちAppURL入れるのがめんどうくせえ! ていう人は
GasDbJsonWriterEditorWindow.csの28行目にURLつっこんじゃってください
■免責
何分、この手のライブラリをパブリックに公開する経験が初めてなので
色々不手際あると思います。なんかいい感じにしてもろて……
今後も随時アップデートは行う予定です。
■謝辞
・自分が組み立てた粗削りなソースコードを
もぉんに整地&サンプル実装してもらいました ありがと~
Totorockさんのものを元にして構築しました。
面影はほぼ残っていませんがGASを学ぶのに大いに参考になりました。
すずきかつーき先生のスプシでNCMBっぽいことするやつ、を大いに参考にしています。
■まとめ
みんなでNCMBのこれまでに感謝しつつ新天地に移行しよう!!
◆定型句
当記事がいい!とおもったら
スキ!やシェアとかフォローなど、お願いいたします!!
この記事が気に入ったらサポートをしてみませんか?