NCMB(ニフクラ mobile backend)では多数のプラットフォームに対してSDKを提供しています。公式のものとしてはObjective-C、Swift、Java、Unity、JavaScriptなどがあります。コミュニティベースではReact Native、Flutter、Google Apps Script、VBA、Ruby、PHP、C#(Xamarin)などもあります。
ゲーム界隈の方たちにはUnity SDKが最も利用されているかと思います。今回はUnity SDKを使って、データストアに入っているデータを取得、各フィールドの値を扱う方法を解説します。
今回のデータについて
今回は次のようなデータを取得します。
フィールド名 | 型 | 値 |
---|---|---|
objectId | 文字列 | 0UjRUrPe3SPM0Mfh |
createDate | 日時 | 2021-05-31T11:12:13.933+09:00 |
updateDate | 日時 | 2021-06-28T13:17:18.076+09:00 |
array | 配列 | [1,"string",[1,2,3],{"a":"b"}] |
bool | 真偽値 | true |
date | 日時 | 2021-06-06T10:51:03.606+09:00 |
geo | 位置情報 | 33.857619,122.378986 |
number | 数値 | 100 |
numbers | 配列 | [1,2,3] |
string | 文字列 | 文字列です |
データの取得
データの取得は NCMBObject の FetchAsync を使っています。
NCMBObject obj = new NCMBObject("TestClass"); obj.ObjectId = "0UjRUrPe3SPM0Mfh"; obj.FetchAsync((NCMBException ex) => { // この中でデータを取得 });
ではここから各フィールドの値を型別に取得します。
規定のフィールド
objectId / createDate / updateDate は規定のフィールドです。取得するための専用メソッドが用意されています。
Debug.Log(obj.ObjectId); // -> 0UjRUrPe3SPM0Mfh Debug.Log(obj.CreateDate); // -> 05/31/2021 02:12:13 Debug.Log(obj.UpdateDate); // -> 06/28/2021 04:17:18
文字列型
文字列の場合は ToString を使います。
// 文字列型 string text = obj["string"].ToString(); Debug.Log(text); // -> 文字列です
数値型
数値の場合は long でキャストします。
// 数値型 long number = (long) obj["number"]; Debug.Log(number); // -> 100
真偽値型
真偽値型も同様です。
// 真偽値型 bool bl = (bool) obj["bool"]; Debug.Log(bl); // -> true
日付型
日付型は DateTime になります。 using System;
が必要です。
// 日付型 DateTime date = (DateTime) obj["date"]; Debug.Log(date); // -> 06/06/2021 01:51:03
位置情報型
位置情報型はNCMBGeoPointになります。キャストして利用します。
// 位置情報型 NCMBGeoPoint geo = (NCMBGeoPoint) obj["geo"]; Debug.Log(geo.Latitude); // -> 33.857619 Debug.Log(geo.Longitude); // -> 122.378986
配列型
まず数字の配列の場合です。ArrayListとして取得します。取得した後、さらにキャストが必要になります。
// 配列型 ArrayList res2 = obj["numbers"] as ArrayList; long[] numbers2 = new long[res2.Count]; for (var i = 0; i < res2.Count; i++) { numbers2[i] = (long) res2[i]; } Debug.Log(numbers2[2]); // -> 3
さらに複雑な配列型
さらに複雑な場合には、各要素ごとにキャストしながら利用してください。元データは次のようになっています。
[ 1, "string", [1,2,3], { "a":"b" } ]
ArrayList res = obj["array"] as ArrayList; Debug.Log("オブジェクト型"); Debug.Log(res); // -> System.Collections.ArrayList long num = (long) res[0]; Debug.Log(num); // -> 1 string str = res[1].ToString(); Debug.Log(str); // -> string ArrayList numbers = (res[2] as ArrayList); Dictionary<string, object> dict = res[3] as Dictionary<string, object>; Debug.Log(dict["a"].ToString()); // -> b
キーバリューのJSONを入れている場合にはDictionary型で定義してキャストしてください。
まとめ
データストアでは柔軟にデータが格納できる一方で、アプリ上で扱う際には各型へキャストしなければいけません。位置情報型のように、データストア特有の形式になっているものもありますので、その扱い時には注意してください。