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

トップ >ドキュメント >データストア(Unity):基本的な使い方

データストア(Unity)

ドキュメント内検索

基本的な使い方

概要

このページでは、データストア機能の基本的な使い方について解説していきます。

データストアで利用可能なデータ型

データストアでは、以下の値が利用可能です。

種類 サンプル
文字列 ABC
配列 ["orange", "apple", "grape"]
数字 123
日付 2013-09-06T01:51:03.606Z
真偽値 true または false
オブジェクト {"name":"orange"}
緯度経度(位置情報) 33.857619,122.378986

アプリでの実装

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";

オブジェクトの取得

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

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

ここでは、1番目のobjectIdをもとに取得する方法を説明します。

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

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

オブジェクトの更新

保存済み(または、objectIdを持っている)のオブジェクトに新しい値をセットして
SaveAsyncメソッドを保存時と同様に実行することでデータストアの値が更新されます。

オブジェクトの削除

オブジェクトをデータストアから削除する場合は、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を実行します。

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

// 子オブジェクトを取得する
child.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は保存済みである必要があります。

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);

リレーション先を検索する場合は、GetQueryメソッドを利用することで、
リレーション先のNCMBQueryオブジェクトを取得できます。
以下の例は、オブジェクト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);
                }
            }
        });
    }
});

基本的な検索の利用

mobile backend上に保存されているデータを検索する場合には、NCMBQueryクラスを利用します。
以下のサンプルでは、QueryTestクラスにて、Scoreが7であるオブジェクトを取得しています。
WhereEqualToメソッドで検索条件を設定し、
FindAsyncメソッドで、指定された条件のオブジェクトを検索しています。

//QueryTestを検索するクラスを作成
NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject> ("QueryTest");
//Scoreの値が7と一致するオブジェクト検索
query.WhereEqualTo ("Score", 7);
query.FindAsync ((List<NCMBObject> objList ,NCMBException e) => {
    if (e != null) {
        //検索失敗時の処理
    } else {
        //Scoreが7のオブジェクトを出力
        foreach (NCMBObject obj in objList) {
            Debug.Log ("objectId:" + obj.ObjectId);
        }
    }
});

標準クラスを検索する場合のクラス名

会員やロール・ファイルなど、mobile backendに標準で存在するクラスに対して、
inQueryを用いた検索など、クラス名を指定する必要がある場合は以下をご覧ください。

クラス名 役割
user 会員管理のクラス
role ロールのクラス
file ファイルストアのクラス
installation 端末情報一覧のクラス
push プッシュ通知のクラス

各クラスのデータをより効率的に検索するにはこちらをご参考ください。

検索条件を設定する

主な検索条件は以下のとおりです。

// Score = 7
query.WhereEqualTo("Score",7);

// Score != 7
query.WhereNotEqualTo ("Score", 7);

// Score < 5
query.WhereLessThan("Score",5);

// Score <= 5
query.WhereLessThanOrEqualTo("Score",5);

// Score > 5
query.WhereGreaterThan("Score",5);

// Score >= 5
query.WhereGreaterThanOrEqualTo("Score",5);

検索条件に複数の値を配列形式で設定し、
そのうちのいずれかと一致するオブジェクトを検索することができます。

NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject> ("QueryTest");
List<int> request =  new List<int> { 1, 5, 10};

//1,5,10のいずれかと一致するオブジェクトを検索
query.WhereContainedIn("Score",request);

//1,5,10のいずれとも一致しないオブジェクトを検索
query.WhereNotContainedIn("Score",request);

//配列に1,5,10のいずれかが含まれているオブジェクトを検索
query.WhereContainedInArray("ScoreArray",request);

//配列に1,5,10のいずれも含まないオブジェクトを検索
query.WhereNotContainedInArray("ScoreArray",request);

//配列に1,5,10をすべて含むオブジェクトを検索
query.WhereContainsAll("ScoreArray",request);

limitやskipを使って、取得件数や取得開始位置を指定することができます。
また、複数のオブジェクトがある場合はソートすることも可能です。

//取得件数の指定
query.Limit = 5;

//取得開始位置の指定
query.Skip = 6;

// 昇順
query.OrderByAscending ("Score");

// Scoreでの昇順でソートしたあと、Ageでの昇順でソートする
NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject> ("SortTest");
query.OrderByAscending ("Score");   //Scoreを昇順で並べ替え
query.AddAscendingOrder ("Age");    //さらにAgeを昇順で並べ替え

// 降順
query.OrderByDescending ("Score");

// Scoreでの降順でソートしたあと、Ageでの降順でソートする
NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject> ("SortTest");
query.OrderByDescending ("Score");  //Scoreを降順で並べ替え
query.AddDescendingOrder ("Age");   //さらにAgeを降順で並べ替え

参照先オブジェクトの取得

あるオブジェクトへの参照(ポインタ)を保存しているフィールドを、Includeで指定することで、
参照先のオブジェクトを親オブジェクトとともに取得することが可能です。

// Parentクラスのうち、objectIdがxxxxxxxxのオブジェクトを取得する
// このとき、Childフィールドに格納した子オブジェクトも取ってくるよう指定
NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject> ("Parent");
query.WhereEqualTo("objectId","xxxxxxxx");
query.Include("Child");

query.FindAsync ((List<NCMBObject> objList ,NCMBException e) => {

    if (e == null) {
        // 取得成功時
        foreach( NCMBObject obj in objList ){
            NCMBObject child = (NCMBObject)obj["Child"];
            Debug.Log( child.ObjectId );
        }
    } else {
        // 取得失敗時
    }
});

クラスの件数を取得する

CountAsyncメソッドを利用することで、
クエリの検索条件に当てはまるデータの件数を取得することができます。

条件を指定しない場合はクエリ作成時に指定したクラスの全件数が返却されます。

NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject> ("QueryTest");
query.WhereEqualTo("Score",7);
query.CountAsync((int count , NCMBException e )=>{
    if(e != null){
        //件数取得失敗時の処理
    }else{
        //件数を出力
        Debug.Log("件数 : "+ count);
    }
});

AND検索/OR検索について

オペランドを複数指定することで、AND検索を行うことができます。
以下の例では、Scoreが30を超え、50未満の値となるよう条件を設定しています。

NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject> ("QueryTest");
// Score > 30
query.WhereGreaterThan("Score",30);
// Score < 50
query.WhereLessThan("Score",50);

また、Orメソッドを利用することで、
複数のクエリによるをOR検索が可能です。

//1つ目の検索条件
NCMBQuery<NCMBObject> firstQuery = new NCMBQuery<NCMBObject> ("QueryTest");
firstQuery.WhereLessThanOrEqualTo ("Score", 4);

//2つ目の検索条件
NCMBQuery<NCMBObject> secondQuery = new NCMBQuery<NCMBObject> ("QueryTest");
secondQuery.WhereEqualTo ("Score", 7);

List<NCMBQuery<NCMBObject>> queries = new List<NCMBQuery<NCMBObject>> ();
queries.Add (firstQuery);
queries.Add (secondQuery);

//検索条件を結合する
NCMBQuery<NCMBObject> mainQuery = NCMBQuery<NCMBObject>.Or (queries);

ダッシュボードでの操作

クラスを新たに作成する

ダッシュボード左側メニューのデータストアをクリックしてください。

緑の「+作成」ボタンをクリックして、新規作成を選択します。
すると以下のようなポップアップが表示されます。

クラス名を入力し、「作成する」ボタンをクリックすると、クラスが新規に作成されます。
データストアでも作成したクラスが表示されます。以下の例では作成したClass_Testが表示されています。

ファイルからクラスをインポートする

データストアでは、エクスポートしたデータや、お客様がカスタマイズしたJSON形式・テキスト形式(.txt)・CSV形式のファイルをインポートすることにより、クラスを作成することが可能です。
JSON形式のデータをインポートする場合、インポートしたいデータは以下の例のように「results」をキーとする配列に格納されている必要があります。

{
  "results":[
    {
      "name":"Cola",
      "color":"black"
    },
    {
      "name":"Coffee",
      "color":"black"
    },
    {
      "name":"Dr Pepper",
      "color":"black"
    },
    {
      "name":"Milk",
      "color":"white"
    }
  ]
}

また、テキスト形式やCSV形式のファイルからインポートした場合、1行目がフィールド名として認識され、2行目以降の内容がデータとしてインポートされます。
以下の例では、name、flag、numberというフィールドが作成され、2行目以降がデータとして登録されます。
ダブルクォーテーションで囲った文字は、文字列として認識されます。それ以外の記述方法は、データストアで利用可能な型に準じています。

name,flag,number
"hoge",true,123
"fuga",true,10

  • 注意
    • カンマの直後に半角スペースを入れると正しく値が認識されない場合があります
    • オブジェクト形式(緯度経度、日付型、ポインタ型 等)はインポートできません

インポートするファイルは、日本語の文字化けを防ぐために、文字コードをUTF-8にして保存してください。また、UTF-8のファイルでもBOMがついているファイルをインポートしようとすると、エラーが返却されますので注意してください。
インポート可能な最大ファイルサイズは2GBとなっています。

インポートしたい場合は、データストアの画面にて、緑の「+作成」ボタンをクリックしてインポートを選択します。

以下のようなポップアップが表示されますので、クラス名を入力し、インポートするファイルを選択して、「インポート」ボタンをクリックしてください。

エクスポートしたデータをインポートするなど、すでに同じ名前のクラスがデータストア内に存在している場合、重複エラーが発生します。
その場合は、既存のクラスを削除してからもう一度インポートしてください。

データをエクスポートしたい場合には以下のページをご覧ください。
エクスポート機能を利用する

クラスを削除する

上で作成したClass_Testをクラスを削除するには、データストアの右上にある「クラスの編集」ボタンをクリックします。

以下のページに遷移するので、「クラスの削除」ボタンをクリックします。

右上にある「クラスの削除」ボタンをクリックすると、以下のポップアップが表示されます。

クラスを削除していいか確認してから、クラスの削除を実行してください。

フィールドを新たに作成する

データストアの画面で、フィールドを作成するクラスをクリックしてください。

データストアの上側にある「+新しいフィールド」ボタンをクリックします。

フィールド名を入力して、「作成する」ボタンをクリックしてください。

フィールドを削除する

フィールドの削除は、クラスの編集画面から行います。データストアの右上にある「クラスの編集」ボタンをクリックしてください。

作成したフィールドの左側にチェックボックスがあります。削除するフィールドのチェックボックスをクリックし、「+新規フィールド」ボタンの横にある削除ボタンをクリックすると、ポップアップが表示されます。

フィールドを削除していいか確認してから、フィールドの削除を実行してください。

レコードを追加する

データストアの画面で、レコードを追加するクラスをクリックしてください。

データストアの左上にある「+新しいレコード」をクリックすると、空のレコードが表示されます。
また、レコードが1つも存在しないクラスの場合、データストアの中央にも、レコード追加のボタンが表示されます。

データストアでは、追加したフィールドのみ編集可能で、その他のフィールドは自動的に値が格納されます。
以下の例では、nameというフィールドを追加したので、空のレコードをダブルクリックし、nameフィールドに「tarou」と入力しました。
エンターキーを押すと値が登録され、objectIdやcreateDateなどが自動的に登録されます。
レコードの追加
値を編集中の時は、データ型を選択する吹き出しが表示されるので、文字列や数値など、どのデータ型で値を登録するのか設定することができます。
データ型の選択

レコードを削除する

各レコードの左側にあるチェックボックスをクリックし、「+新しいフィールド」ボタンの横にある「削除」ボタンをクリックすると、ポップアップが表示されます。

レコードを削除していいか確認してから、レコードの削除を実行してください。

レコードの検索

データストアにあるデータが増えてきた場合などに、絞り込み検索を使って効率的にデータストアを閲覧することが可能です。
データストアの左下にある、「絞り込み」ボタンをクリックすると、検索条件を設定することができます。
絞り込み検索1
絞り込み検索の条件は、以下のように設定します。

  • フィールド名を指定する
  • 検索する値を入力する
  • 検索する値のデータ型を指定する
  • 検索条件を指定する
  • 適用ボタンをクリック

この時、検索条件で「いずれかと同じ」「いずれかを含む」「いずれとも違う」を選択した場合は、配列形式で異なったデータ型の値を検索条件に指定することが可能です。
以下の例では、numberというフィールドで、数値として登録された「1」と、文字列として登録された「1」を検索条件で指定しています。
絞り込み検索3
また、検索条件追加のアイコンをクリックすることで、検索条件を複数設定できます。

クラスのパーミッションを設定する

クラスの編集画面で、右上の「パーミッションの設定」ボタンをクリックします。
クラスのパーミッション設定
ポップアップが表示されるので、「+新しいパーミッション」をクリックしてパーミッションの設定を追加してください。
対象を会員やロールに限定することで、パーミッションを一部の会員に限定することが可能です。

クラスのパーミッションを削除する

クラスのパーミッションは、各行の左側にあるチェックボックスをクリックし、削除ボタンをクリックすると削除できます。

レコードのパーミッションを設定する

レコードのパーミッションを設定するには各レコードの右側にあるパーミッション編集ボタンをクリックします。
レコードのパーミッション設定画面
パーミッション設定画面が表示されますので、「+新しいパーミッション」ボタンをクリックして、パーミッションを設定してください。

レコードのパーミッションを削除する

レコードのパーミッションは、各行の左側にあるチェックボックスをクリックし、削除ボタンをクリックすると削除できます。

暗号化の設定

mobile backendへのデータ保存時に、暗号化を実施するかフィールドごとに設定することが可能です。
データストアを開き、クラスを選択して右上の「クラスの編集」ボタンをクリックしてください。

フィールドの一覧が表示され、暗号化が可能なフィールドのみ「暗号化する」ボタンがクリックできるようになっています。

「暗号化する」ボタンをクリックすると以下のような確認画面が表示されますので、問題なければ暗号化してください。

暗号化を解除する場合は、クラスの編集画面にて「暗号化を解除する」ボタンをクリックしてください。

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

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

ページの先頭へ