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

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

データストア(iOS)

ドキュメント内検索

基本的な使い方

概要

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

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

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

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

アプリでの実装

NCMBObjectについて

ニフティクラウドmobile backendのデータストア機能はNCMBObjectを通じて利用します。
NCMBObjectはスキーマレスなJSON互換のkey-value形式のオブジェクトを扱うことができます。
オブジェクトの保存先はNCMBObjectの初期化時に指定したクラスで識別されます。

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

オブジェクトをデータストアに非同期で保存するには、saveInBackgroundWithBlockメソッドが利用できます。
指定したクラスがデータストアに存在しない場合は、新規にクラスが作成されます。

role, file, push, user, installation などは標準クラスとして作成されているので、
新規クラス作成時にはクラス名にセットできません。

//testクラスのNCMBObjectを作成
NCMBObject *object = [NCMBObject objectWithClassName:@"test"];

//オブジェクトに値を設定
[object setObject:@"value" forKey:@"key"];

//データストアへの登録を実施
[object saveInBackgroundWithBlock:^(NSError *error) {
    if (error){
        //保存に失敗した場合の処理
    } else {
        //保存に成功した場合の処理
    }
}];

オブジェクトの取得

データストアにある内容を取得する場合は、オブジェクトの検索を実施するか
以下のようにobjectIdを指定してfetchInBackgroundWithBlockメソッドを利用します。

//testクラスへのNCMBObjectを設定
NCMBObject *object = [NCMBObject objectWithClassName:@"test"];

//objectIdプロパティを設定
object.objectId = @"testObjectId";

//設定されたobjectIdをもとにデータストアからデータを取得
[object fetchInBackgroundWithBlock:^(NSError *error){
    if (error){
        //取得に成功した場合のしょり
    } else {
    }
}];

通信状況をチェックしてオブジェクト保存を行う

saveEventuallyメソッドは、通信状況をチェックして保存処理を行うメソッドです。
オンラインの場合はsaveInBackgroundWithBlockメソッドが実行されますが、
ネットワークがオフラインの時には保存処理は行われず、オンラインになり次第再開されます。
保存完了前にアプリが終了された場合、次回起動時に再処理を行います。

[object saveEventually:^(NSError *error) {
    if (!error){
        //保存処理が成功した場合
    } else {
        //保存処理が失敗した場合
    }
}];

オブジェクトの更新

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

データストアに対しての操作を設定する

NCMBObjectには値をセットするだけではなく、
データストアに対しての操作も設定することができます。
以下にいくつかのサンプルコードをあげておきます。

  • 指定したフィールドの値をインクリメントする
[object incrementKey:@"count"];

  • 指定したフィールドに要素がユニークになるよう配列の値を追加する
[post addUniqueObjectsFromArray:[NSArray arrayWithObjects:@"food",
                                 @"fish",
                                 nil]
                         forKey:@"tags"];

オブジェクトの削除

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

[object deleteInBackgroundWithBlock:^(NSError *error) {
    if (error){
        //削除に失敗した場合
    } else {
        //削除に成功した場合
    }
}];

オブジェクトの関連付け

NCMBObjectのインスタンスに、別のNCMBObjectを設定すると、
設定したNCMBObjectへのポインタ(参照)が設定されます。
ポインタ先のオブジェクトがデータストアに登録されていない場合は、
ポインタもとのオブジェクト保存前に自動で保存されるようになっています。

NCMBObject *pointer = [NCMBObject objectWithClassName:@"child"];
[pointer setObject:@"value" forKey:@"key"];

NCMBObject *object = [NCMBObject objectWithClassName:@"object"];

//ポインタをセットしたオブジェクトを作成
[object setObject:pointer forKey:@"pointer"];

ポインタは1つのオブジェクトへの参照しか持つことができませんが、
リレーションを利用することで、特定クラスの複数オブジェクトと関連づけることが可能です。

リレーションを追加・削除する場合は、NCMBRelationクラスを利用します。
ポインタとは異なり、データストアに未登録のオブジェクトが
自動的に保存されることはありません。

// リレーションもとのオブジェクトを作成
NCMBObject *post = [NCMBObject objectWithClassName:@"Post"];
[post setObject:@"about mobile backend" forKey:@"title"];

// リレーション先のオブジェクトを作成
NCMBObject *comment1 = [NCMBObject objectWithClassName:@"Comment"];
[comment1 setObject:@"good" forKey:@"text"];
[comment1 save:nil];

// リレーション先のオブジェクトを作成
NCMBObject *comment2 = [NCMBObject objectWithClassName:@"Comment"];
[comment2 setObject:@"bad" forKey:@"text2"];
[comment2 save:nil];

//commentsフィールドにNCMBRelationを作成
NCMBRelation *relation = [post relationforKey:@"comments"];

//リレーションにオブジェクトを追加
[relation addObject:comment1];

//リレーションにオブジェクトを追加
[relation addObject:comment2];

// リレーションを設定したオブジェクトを保存する
[post save:nil];

オブジェクトの検索を行う

データストアを検索する場合は、NCMBQueryクラスを利用します。
デフォルトでは条件なしでの検索が行われますが、
以下のサンプルコードでは検索条件を設定しています。

//Postクラスを検索するNCMBQueryを作成
NCMBQuery *query = [NCMBQuery queryWithClassName:@"Post"];

//authorがncmbと一致するデータを検索する条件を設定
[query whereKey:@"author" equalTo:@"ncmb"];

//データストアの検索を実施
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (error) {
        //検索失敗時の処理
    } else {
        //検索成功時の処理
    }
}];

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

会員やロール、ファイルなどニフティクラウド mobile backendに標準で存在するクラスに対して
データの検索を行う場合は、以下のクラス名を指定してください。

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

通常は、SDKの各クラスが標準クラスを検索するための
NCMBQueryが返却されるメソッドを用意しています。

//userクラスを検索するクエリを作成
NCMBQuery *query = [NCMBUser query];

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

検索条件を設定する

上記で使用したwhereKey:equalToメソッド以外にも、
いろいろな検索条件を設定することができます。
詳細はSDKリファレンス:NCMBQueryをご覧ください。

  • 配列に対する条件の設定
// arrayKey: [1, 2, 3]
[query whereKey:@"arrayKey" equalTo:[NSNumber numberWithInt:2]];

// 指定した複数の値がすべて含まれるものにマッチする
[query whereKey:@"arrayKey" containsAllObjectsInArray:@[@2, @3, @4]];

  • ポインタに対する条件の設定
//Postクラスを検索するクエリを作成
NCMBQuery *innerQuery = [NCMBQuery queryWithClassName:@"Post"];

//authorがncmbと一致するデータを検索
[innerQuery whereKey:@"author" equalTo:@"ncmb"];

//Commentクラスを検索するためのクエリを作成
NCMBQuery *query = [NCMBQuery queryWithClassName:@"Comment"];

//innerQueryの条件と一致するデータをpostフィールドで参照しているデータが検索される
[query whereKey:@"post" matchesQuery:innerQuery];

//設定した条件で検索を実施
[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) {
}];

  • リレーション先を検索する
NCMBObject *country = [NCMBObject objectWithClassName:@"Country"];

//リレーションを作成
NCMBRelation *relation = [country relationforKey:@"town"];

//リレーション先を検索するクエリを取得
NCMBQuery *query = [relation query];

クエリの合成

条件を複数指定することで、and検索を行うことができます。
以下の例では、intというキーが30を超え、50未満の値となるよう条件を設定しています。

NCMBQuery *query = [NCMBQuery queryWithClassName:@"queryTestClass"];

//intが30より上を指定
[query whereKey:@"int" greaterThan:@30];

//intが50未満を指定
//intが30より上で、50未満の値を検索する条件が設定される
[query whereKey:@"int" lessThan:@50];

また、orQueryWithSubqueriesメソッドを利用することで、
複数のクエリをOR合成することができます。

NSString *className = @"test";

//一つめのクエリを作成
NCMBQuery *query1 = [NCMBQuery queryWithClassName:className];
[query1 whereKey:@"key1" equalTo:@"value1"];

//二つめのクエリを作成
NCMBQuery *query2 = [NCMBQuery queryWithClassName:className];
[query2 whereKey:@"key2" equalTo:@"value2"];

//OR検索を行うためにクエリを合成する
//key1がvalue1であるか、key2がvalue2であるデータを検索する条件となる
NCMBQuery *query = [NCMBQuery orQueryWithSubqueries:@[query1,query2]];

ダッシュボードでの操作

クラスを新たに作成する

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

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

クラス名を入力し、「作成する」ボタンをクリックすると、クラスが新規に作成されます。
データストアでも作成したクラスが表示されます。以下の例では作成した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以上

ページの先頭へ