サーバー構築不要!スマートフォンアプリ向けの新クラウド

トップ >ドキュメント >SDKガイド(Unity):オブジェクト操作

SDKガイド(Unity)

ドキュメント内検索

オブジェクト操作

このドキュメントは更新されていません。
こちらから最新版をご覧ください。

概要

NCMBObjectは、mobile backendへのオブジェクトの保存・更新・削除などを行うクラスです。
NCMBObjectはスキーマレスなJSON互換のkey-value形式のオブジェクトを扱うことができます。
オブジェクトの保存先はNCMBObjectの初期化時に指定したクラス名で識別されます。

プロパティ

NCMBObjectクラスの主要な規定プロパティは以下の通りです。

// ClassName: オブジェクトのクラス名 
// ObjectId: オブジェクトのID
// CreateDate: 登録日時
// UpdateDate: 更新日時
// ACL: アクセス権限情報
// IsDirty: オブジェクトの変更の有無
// Keys: オブジェクトの持つキー
// Item: オブジェクトのkey-value取得、設定

オブジェクトをデータストアに保存する

オブジェクトをデータストアに保存するには、SaveAsyncメソッドが利用できます。
指定したクラスがデータストアに存在しない場合は、新規にクラスが作成されます。
※ role, file, push, user, installation などは標準クラスとして作成されているので、新規クラス作成時にはクラス名にセットできません。

キーと値をセットする場合は、AddメソッドかItemプロパティを利用します。
※Addメソッド、Itemプロパティについて
Itemプロパティを使用すると、オブジェクトに存在しないキーの値を設定することで、新しい要素を追加することができます。
指定したキーがすでに存在する場合は、以前の値を上書きします。
Addメソッドの場合は、指定したキーを持つ値がすでに存在する場合、例外をスローします。

以下のサンプルコードでは、testというキーにvalueという値をセットして
オブジェクトを保存しています。

NCMBObject obj = new NCMBObject ("Book");
obj.Add ("test", "value");
obj.SaveAsync ((NCMBException e) => {      
    if (e != null) {
        //エラー処理
    } else {
        //成功時の処理
    }                   
});

//Itemプロパティを用いる場合は、Addメソッドの部分を、以下の用に書き換えます。
obj["test"] = "value";

Unity SDKで利用できるデータ型は以下の通りです。
日付型などは、SDKがDateTime型をmobile backendの形式に変換して利用しています。

//文字列
string userName = "unity";

//数値(long,float,doubleも利用可能)
int score = 10;

//日付
DateTime date = DateTime.Now;

//真偽値
bool flag = true;

//配列
string[] array = new string[4] {"a", "b", "c", "d"};

//Listクラス
List<string> array = new List<string>();

//Dictionaryクラス
Dictionary<string,object> items = new Dictionary<string,object>();

//オブジェクト
object testObject = "testObject";

オブジェクトの取得

オブジェクトの取得方法は以下の2つがあります。

  • objectIdをもとに、データを取得する
  • クエリを作成してオブジェクトを検索する

ここでは、1番目のobjectIdをもとに取得する方法を説明します。Unity SDKでのオブジェクト検索については、クエリの使い方をご覧ください。

FetchAsyncメソッドを利用することで指定されたobjectIdのデータをmobile backendから取得できます。
以下のサンプルコードでは、objというオブジェクトをデータストアに保存したあと、objectIdをもとにしてそのオブジェクトを再び取得しています。

//オブジェクトを保存する
NCMBObject obj = new NCMBObject ("Book");
obj.Add ("Unity1", "fetchTest");
obj.SaveAsync ();
Thread.Sleep (3000);//非同期待ち

//保存したオブジェクトのobjectIdをもとに取得を行う
NCMBObject obj2 = new NCMBObject ("Book");
obj2.ObjectId = obj.ObjectId;
obj2.FetchAsync ((NCMBException e) => {        
    if (e != null) {
        //エラー処理
    } else {    
        //成功時の処理
    }               
});

オブジェクトの削除

オブジェクトをデータストアから削除する場合は、DeleteAsyncメソッドを利用します。

NCMBObject objDelete = new NCMBObject ("Book");
objDelete.ObjectId = obj.ObjectId;  //obj.ObjectIdに保存時のIDが保存されている
objDelete.DeleteAsync ((NCMBException e) => {
    if (e != null) {
        //エラー処理
    } else {
        //成功時の処理
    }
});

データ操作

・Increment
指定したキーをインクリメントします。
引数にdouble型を指定した場合のIncrement結果は、double型になります。
double型以外を指定した場合の結果はlong型になります。

NCMBObject obj = new NCMBObject ("SaveTest");
obj.Increment ("score");
obj.Increment ("score", 5);
obj.Increment ("score", 5.5);
obj.SaveAsync ();

・AddToListとAddRangeToList
配列に指定したオブジェクトを追加します。挿入位置は最後に追加します。

NCMBObject obj = new NCMBObject ("SaveTest");
obj.AddToList ("array", 1);

ArrayList array = new ArrayList ();
array.Add (5);
obj.AddRangeToList ("array", array);
obj.SaveAsync ();

・AddUniqueToListとAddRangeUniqueToList
配列に指定したオブジェクトを追加します。
今までに登録されていない値のみ追加します。挿入位置は保証されません。

NCMBObject obj = new NCMBObject ("SaveTest");
obj.AddUniqueToList ("array", 5);

ArrayList array = new ArrayList ();
array.Add (5);
array.Add (2);
obj.AddRangeUniqueToList ("array", array);
obj.SaveAsync ();

・RemoveRangeFromList
配列から一致する複数のオブジェクトを削除します。

ArrayList array = new ArrayList ();
array.Add (2);
obj.RemoveRangeFromList ("array", array);
obj.SaveAsync ();

別オブジェクトへの参照を追加・参照先オブジェクトの取得(ポインタ)

NCMBObjectに別のNCMBObjectをセットすることも可能です。
この場合、データストア保存時にはセットされたNCMBObjectへのポインタがセットされます。

NCMBObject childObj = new NCMBObject ("SubObject");
childObj.Add ("score", 10);

NCMBObject obj = new NCMBObject ("MainObject");
obj.Add ("SubObject", childObj);

obj.SaveAsync ((NCMBException e) => {
    if (e != null) {
        //エラー処理
    } else {
        //成功時の処理
    }      
});

参照先のオブジェクトを取得する場合は、セットされた子オブジェクトのインスタンスを作成し、
objectIdをもとにFetchAsyncを実行します。

// 保存した親をサーバーから取得(ここでは親のobjectIdが xxxxxxxx であるとする)
NCMBObject obj2 = NCMBObject.CreateWithoutData ("MainObject", "xxxxxxxx");
obj2.FetchAsync ();

// 取得待ち
System.Threading.Thread.Sleep(2000);

// 子オブジェクトのポインタを取得
NCMBObject child2 = (NCMBObject)obj2["SubObject"];

// この段階では子オブジェクトの中身は手に入らない(例外が起こる)
// Debug.Log( child2["score"] );

// 子オブジェクトの中身をフェッチ
child2.FetchAsync ();

// 取得待ち
System.Threading.Thread.Sleep(2000);

// この段階まで来ると子オブジェクトの中身が手に入る
Debug.Log( child2["score"] );

ただし、オブジェクト検索時にincludeを指定すると元のオブジェクトにNCMBObject自体が
セットされるようになるため、FetchAsyncを実行する必要はありません。
オブジェクト検索時のリクエスト方法については、クエリの使い方をご覧ください。

別オブジェクトへの参照を追加・参照先オブジェクトの取得(リレーション)

NCMBObjectに別のNCMBObjectを複数セットしたい時にはリレーションを用います。
この場合、データストア保存時にはセットされたNCMBObjectへのリレーションがセットされます。

//リレーション先作成
NCMBObject childObj1 = NCMBObject.CreateWithoutData ("SubClass", "object_id_1");
NCMBObject childObj2 = NCMBObject.CreateWithoutData ("SubClass", "object_id_2");

//親のリレーション取得
NCMBObject parentObj = new NCMBObject ("MainClass");
NCMBRelation<NCMBObject> relation = parentObj.GetRelation<NCMBObject> ("Class");

//親にリレーション追加
relation.Add (childObj1);
relation.Add (childObj2);

parentObj.SaveAsync ();

//リレーション先の削除を行う場合は、Addメソッドの部分を、以下の用に書き換えます。
relation.Remove (childObj1);
relation.Remove (childObj2);

parentObjは未保存でも実行できますが、リレーション先であるchildObjは保存済である必要があります。

※AddとRemoveを組み合わせた場合の動作について
UnitySDKでは、AddとRemoveを保存前に組み合わせて実行した場合、別々のオブジェクトに対してのAdd,Remove操作は行えません。
組み合わせる場合はどちらか一方の操作をSaveAsync()で保存し、保存が完了してからもう一方の操作を行ってください。
AddとRemoveで同じオブジェクトを指定した場合は、相殺され結果的に指定したオブジェクトのリレーション操作はなかった事になります。

以下が組み合わせのパターン例と結果になります。

 //パターン1 結果:OK 動作:相殺され何もしない
 relation.Add (childObj1);
 relation.Remove (childObj1);

 //パターン2 結果:NG 動作:リレーション操作が別々のオブジェクトのためExceptionが発生。
 relation.Add (childObj1);
 relation.Remove (childObj2);

 //パターン3 結果:OK 動作:childObj2のみ保存される(childObj1は相殺されているため)
 relation.Add (childObj1);
 relation.Remove (childObj1);
 relation.Add (childObj2);

リレーション先を検索する場合は、以下の用に記述します。
以下の例は、オブジェクトIDがxxxxxxxxxである親オブジェクトからリレーション先を検索する例です。

NCMBObject parentObj = NCMBObject.CreateWithoutData ("MainClass", "xxxxxxxxxxxx");
parentObj.FetchAsync ((NCMBException e) => {
    if (e != null) {
        //エラー処理
    } else {
        //親のリレーション取得
        NCMBRelation<NCMBObject> relation = parentObj.GetRelation<NCMBObject> ("Class");
        NCMBQuery<NCMBObject> query = relation.GetQuery ();

        //リレーション先検索
        query.FindAsync ((List<NCMBObject> childObjList,NCMBException error) => {
            if (error != null) {
                //エラー処理
            } else {
                //成功時の処理
                foreach (NCMBObject obj in childObjList) {
                    Debug.Log ("objectId : " + obj.ObjectId);
                }
            }
        });
    }
});

お探しの内容が見つからなかった場合はユーザーコミュニティ もご活用ください。(回答保証はいたしかねます)
なお、 Expertプラン以上のお客様はテクニカルサポートにてご質問を承らせて頂きます。

推奨画面サイズ1024×768px以上

ページの先頭へ