ニフティクラウド mobile backendのUnity SDKを使い倒してみる-NCMBObject編-


##クイックスタートからやってみる

http://mb.cloud.nifty.com/doc/current/introduction/quickstart_unity.html

```csharp:NCMB-test.cs

using UnityEngine;
using System.Collections;
using NCMB;
using System.Collections.Generic;


public class NCMB_test : MonoBehaviour {

	// Use this for initialization
	void Start () {
		NCMBObject testClass = new NCMBObject("TestClass");
		testClass["message"] = "Hello, NCMB!";
	　　testClass.SaveAsync();
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}


```

unitySDKのリファレンスは以下

http://mb.cloud.nifty.com/assets/sdk_doc/unity/Help/index.html

以降void Start()を改変して上記のドキュメントを一つづ使っていくことを始める。


## .Add

Addはこうやって使うっぽい

```csharp:NCMB-test.cs
NCMBObject testClass = new NCMBObject("TestClass");
testClass["message"] = "Hello, NCMB!";
testClass.Add ("key","value");
testClass.SaveAsync();	
```

![スクリーンショット 2015-09-26 22.03.46.png](https://qiita-image-store.s3.amazonaws.com/0/55227/2db7778b-d01e-7aa5-a6bd-702f5af55754.png "スクリーンショット 2015-09-26 22.03.46.png")

## .AddRangeToList

AddRangeToListは配列を保存するものらしい

```csharp:NCMB-test.cs

NCMBObject testClass = new NCMBObject("TestClass");
testClass["message"] = "Hello, NCMB!";
int[] sourceDatas = new int[] { 123, 456, 789 };
IEnumerable<int> evens = sourceDatas ;
testClass.AddRangeToList ("key",evens);
testClass.SaveAsync();

```

実行するとこうなる

![スクリーンショット 2015-09-26 22.03.46.png](https://qiita-image-store.s3.amazonaws.com/0/55227/c94e0185-5ff3-bc34-3e0a-d9f8f1832086.png "スクリーンショット 2015-09-26 22.03.46.png")

IEnumerable自体が、作った配列にさまざまな操作を行えるようなものらしい
https://msdn.microsoft.com/ja-jp/library/h1x9x1b1
ちなみに現在のUnityは.NET3.5らしいので上の↑ドキュメントに書かれていることはほとんどできないが。。。

## .AddRangeUniqueToList

配列についかするメソッドだが、追加前の配列と追加する配列の重複する要素は除いて追加を行う関数

```csharp:NCMB-test.cs

NCMBObject testClass = new NCMBObject("TestClass");
testClass["message"] = "Hello, NCMB!";
int[] sourceDatas = new int[] { 123, 456, 789 };
IEnumerable<int> evens = sourceDatas ;
testClass.AddRangeToList ("key",evens);
int[] sourceDatas2 = new int[] { 123,999,111 };
IEnumerable<int> evens2 = sourceDatas2 ;
testClass.AddRangeUniqueToList ("key", evens2);
testClass.SaveAsync();
```

結果
![スクリーンショット 2015-10-11 12.07.19.png](https://qiita-image-store.s3.amazonaws.com/0/55227/3d446203-0cf2-0f74-c794-9e6dfbfb9743.png "スクリーンショット 2015-10-11 12.07.19.png")

## .AddToList


```csharp:NCMB-test.cs
NCMBObject testClass = new NCMBObject("TestClass");
testClass["message"] = "Hello, NCMB!";
int[] sourceDatas = new int[] { 123, 456, 789 };
IEnumerable<int> evens = sourceDatas ;
testClass.AddToList ("key",evens);
testClass.SaveAsync();	
```

結果

![スクリーンショット 2015-10-11 12.42.12.png](https://qiita-image-store.s3.amazonaws.com/0/55227/b261ff80-da4e-9f6d-70af-74ecf373d8b1.png "スクリーンショット 2015-10-11 12.42.12.png")


配列が一つのオブジェクトとして認識される

## .AddUniqueToList

```csharp:NCMB-test.cs
NCMBObject testClass = new NCMBObject("TestClass");
testClass["message"] = "Hello, NCMB!";
int[] sourceDatas = new int[] { 123, 456, 789 };
IEnumerable<int> evens = sourceDatas ;
testClass.AddToList ("key",evens);
int[] sourceDatas2 = new int[] { 123,999,111 };
IEnumerable<int> evens2 = sourceDatas2 ;
testClass.AddUniqueToList ("key", evens2);
testClass.SaveAsync();
```

結果こうなる
![スクリーンショット 2015-10-11 13.15.21.png](https://qiita-image-store.s3.amazonaws.com/0/55227/355fdbd4-48fb-845b-5e28-1f08b6f75a86.png "スクリーンショット 2015-10-11 13.15.21.png")

## .ContainsKey

ローカルで、自分が作ったオブジェクトに特定のキーがあるかないかを調べる

```csharp:NCMB-test.cs
NCMBObject testClass = new NCMBObject("TestClass");
testClass["message"] = "Hello, NCMB!";
bool result = testClass.ContainsKey("message");
Debug.Log (result);
```
![スクリーンショット 2015-10-11 13.35.42.png](https://qiita-image-store.s3.amazonaws.com/0/55227/e3a7b2f2-da3e-93b9-5960-39ecb04bcf75.png "スクリーンショット 2015-10-11 13.35.42.png")



## .DeleteAsync

次は削除系なのであらかじめ最初のDBの状態を示しておく

![スクリーンショット 2015-10-11 16.12.07.png](https://qiita-image-store.s3.amazonaws.com/0/55227/293803e4-25fa-2c55-4766-d95950a3e7a5.png "スクリーンショット 2015-10-11 16.12.07.png")

この２行目のレコードを削除する

```csharp:NCMB-test.cs
NCMBObject testClass = new NCMBObject("TestClass");
testClass.ObjectId = "4BTTFMpreB0r2z78";
testClass.DeleteAsync ();
```

![スクリーンショット 2015-10-11 16.13.02.png](https://qiita-image-store.s3.amazonaws.com/0/55227/305c23b7-90a4-37a4-abb6-6f903cf1e21b.png "スクリーンショット 2015-10-11 16.13.02.png")

## .FetchAsync

次も取得系なのであらかじめ最初のDBの状態を示しておく

![スクリーンショット 2015-10-11 16.38.00.png](https://qiita-image-store.s3.amazonaws.com/0/55227/a8dddb92-f419-9fa7-b51c-373596c30c2c.png "スクリーンショット 2015-10-11 16.38.00.png")


```csharp:NCMB-test.cs
NCMBObject testClass = new NCMBObject("TestClass");
testClass.ObjectId = "swxRC66dFia3s3R3";
testClass.FetchAsync ();
System.Threading.Thread.Sleep(2000);
Debug.Log( testClass["message"] );
```

![スクリーンショット 2015-10-11 16.33.47.png](https://qiita-image-store.s3.amazonaws.com/0/55227/9375ff1b-89bc-147a-de7d-c5a353ed22f5.png "スクリーンショット 2015-10-11 16.33.47.png")

## .GetRelation

リレーションを貼り付けるメソッド、.FetchAsyncメソッドで取得したデータを別のクラスとリレーションさせる

```csharp:NCMB-test.cs
NCMBObject testClass = new NCMBObject("TestClass");
testClass.ObjectId = "swxRC66dFia3s3R3";
testClass.FetchAsync ();
System.Threading.Thread.Sleep (2000);

//親のリレーション取得
NCMBObject parentObj = new NCMBObject ("Parent_TestClass");
NCMBRelation<NCMBObject> relation = parentObj.GetRelation<NCMBObject> ("Class");
		
//親にリレーション追加
relation.Add (testClass);
parentObj.SaveAsync ();
```

すると下記のようなクラスが新たにでき「リレーションを見る」をクリックすると
![スクリーンショット 2015-10-11 17.13.39.png](https://qiita-image-store.s3.amazonaws.com/0/55227/2a8ad7b7-c2e9-8a29-ead1-d80ac1500af3.png "スクリーンショット 2015-10-11 17.13.39.png")

下記のようにリレーション先のクラスがみれる

![スクリーンショット 2015-10-11 17.13.54.png](https://qiita-image-store.s3.amazonaws.com/0/55227/032060c5-648c-84dc-128c-779bb3ef465d.png "スクリーンショット 2015-10-11 17.13.54.png")

## .CreateWithoutData 

リレーション先を探すときに使うものらしい
上記のリレーションの関係で以下のように使うと

```csharp:NCMB-test.cs
NCMBObject parentObj = NCMBObject.CreateWithoutData ("Parent_TestClass", "8FEj5hb0uDvasjvl");
		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);
						}
					}
				});
			}
		});
```

こんな風になる
![スクリーンショット 2015-10-11 18.54.49.png](https://qiita-image-store.s3.amazonaws.com/0/55227/a9d5a050-223e-cb97-360a-79b72f61c6e5.png "スクリーンショット 2015-10-11 18.54.49.png")



## .Increment

次はインクリメント処理なので先ほどの「TestClass」の「key」カラムのバリューを「1」(数値に変えて追加)に変更する、ちょうど下記のような感じ
![スクリーンショット 2015-10-11 17.22.38.png](https://qiita-image-store.s3.amazonaws.com/0/55227/6b89f4d5-cb97-c46f-9553-b4dc4b9af488.png "スクリーンショット 2015-10-11 17.22.38.png")

```csharp:NCMB-test.cs
NCMBObject testClass = new NCMBObject("TestClass");
testClass.ObjectId = "swxRC66dFia3s3R3";
testClass.Increment ("key");
testClass.SaveAsync ();
```

結果こうなる

![スクリーンショット 2015-10-11 17.33.09.png](https://qiita-image-store.s3.amazonaws.com/0/55227/f44651ab-1d3e-1b88-ee45-0a6ca566d513.png "スクリーンショット 2015-10-11 17.33.09.png")

ちなみに

```csharp:NCMB-test.cs
NCMBObject testClass = new NCMBObject("TestClass");
testClass.ObjectId = "swxRC66dFia3s3R3";
testClass.Increment ("key",3);
testClass.SaveAsync ();
```

このようにしてIncrement時に任意の数を指定すると下記のように任意の数だけインクリメントされる（減算時は-1とかを指定する）。

![スクリーンショット 2015-10-11 17.38.19.png](https://qiita-image-store.s3.amazonaws.com/0/55227/3bd00bf6-817f-0075-8a30-bb5b6c01b9fb.png "スクリーンショット 2015-10-11 17.38.19.png")

## .Remove


```csharp:NCMB-test.cs
NCMBObject testClass = new NCMBObject("TestClass");
testClass["message"] = "Hello,NCMB";
testClass ["key"] = 10;
testClass.Remove ("message");
testClass.SaveAsync ();
```

こうなる

![スクリーンショット 2015-10-11 17.56.34.png](https://qiita-image-store.s3.amazonaws.com/0/55227/5852cb46-0580-c623-bf39-a566fe0f6a8c.png "スクリーンショット 2015-10-11 17.56.34.png")

## .RemoveRangeFromList

```csharp:NCMB-test.cs
NCMBObject testClass = new NCMBObject("TestClass");
testClass["message"] = "Hello,NCMB";
int[] sourceDatas = new int[] { 123, 456, 789, 10, 10 };
IEnumerable<int> evens = sourceDatas ;
testClass.AddRangeToList ("key",evens);
int[] RemoveDatas = new int[] {10};
IEnumerable<int> remove = RemoveDatas;
testClass.RemoveRangeFromList ("key",remove);
testClass.SaveAsync ();
```

こうなる
![スクリーンショット 2015-10-11 18.26.43.png](https://qiita-image-store.s3.amazonaws.com/0/55227/ab0018d0-f795-23fb-ebb5-342ac41b8172.png "スクリーンショット 2015-10-11 18.26.43.png")