XamarinはC#を使ったクロスプラットフォームなスマートフォンアプリ開発環境です。企業向けのアプリ開発などで利用されることが多いようです。
NCMBではC#を使った開発環境としてUnityに対応しています。しかし、そちらはiOS/Android SDKをラッピングしているので、Xamarinでそのまま利用できません。C#のみで実装する必要があります。
ここでは現在開発中のC#用SDK(コミュニティSDK)の使い方を紹介します。今回は少し複雑なクエリの使い方です。
インストールについて
C# SDKはNuGetで公開していますので、Visual Studioなどでインポートできます。
使い方
使い方はまず、NCMBClientを読み込みます。
using NCMBClient;
初期化
初期化は次のようにします。アプリケーションキー、クライアントキーは自分のものに変更してください。
var applicationKey = "70d...934"; var clientKey = "4d0...dff"; new NCMB(applicationKey, clientKey);
初期化さえ終われば、次のようなオブジェクトが利用できます。
- NCMBObject
データストアのオブジェクト - NCMBQuery
データストア、会員管理、ロール、Installation、ファイルストア検索用 - NCMBAcl
権限管理用 - NCMBUser
会員管理用 - NCMBRelation
データストアのリレーション - NCMBInstallation
デバイストークン管理用クラス - NCMBGeoPoint
位置情報を扱うクラス
サブクエリ
サブクエリはある検索結果を使って別な検索を行うものです。これをマスターすれば、APIのリクエスト数が減らせるだけでなく、アプリの速度も速くなるでしょう。
サブクエリには2つのパターンがあります。
- ポインターを利用している場合
- ポインターを利用していない場合
ポインターを利用している場合
ポインターを使っており、そのポインターの対象データで絞り込みたい時には InQuery
を使います。たとえば次のようなデータを用意します。 item2 の num カラムに item をセットしています。
for (var i = 0; i < 5; i++) { var item = new NCMBObject("Test"); item.Set("message", "Test message"); item.Set("number", i); item.Save(); var item2 = new NCMBObject("Test2"); item2.Set("message", "Test message"); item2.Set("num", item); item2.Save(); }
このデータに対して、Testクラスの検索結果からTest2クラスを検索するコードは次のようになります。
var q1 = new NCMBQuery("Test"); var q2 = new NCMBQuery("Test2"); // Testクラスの検索条件 q1.InString("number", new int[] { 1, 4 }); // Testクラスの結果を使ってTest2クラスを検索 var items = q2 .InQuery("num", q1) // InQueryで指定 .Include("num") // ポインター先のデータを取得 .FetchAll(); foreach (var item in items) { var num = ((NCMBObject) item.Get("num")).GetInt("number"); }
ポインターを利用していない場合
ポインターを使っていない場合は Select
を使います。たとえば次のようにデータを作成します。TestとTest2クラスは関連がありません。
for (var i = 0; i < 5; i++) { var item = new NCMBObject("Test"); item.Set("message", "Test message"); item.Set("number", i); item.Save(); var item2 = new NCMBObject("Test2"); item2.Set("message", "Test message"); item2.Set("num", i); item2.Save(); }
このデータに対してTest2クラスの検索結果にある num カラムの値を Testクラスの検索に利用する例です。
var q1 = new NCMBQuery("Test"); var q2 = new NCMBQuery("Test2"); q2.InString("num", new int[] {1, 4 }); var t = q2.FetchAll(); var items = q1.Select("number", "num", q2).FetchAll(); foreach(var item in items) { var num = item.GetInt("number"); }
OR検索
2つ以上のクエリを組み合わせて、ORで検索するのが Or
メソッドになります。以下の例はお勧めできるものではありませんが、参考レベルにしてください。
var q1 = new NCMBQuery("QueryTest"); var q2 = new NCMBQuery("QueryTest"); q1.EqualTo("number", 0); q2.EqualTo("number", 1); var query = new NCMBQuery("QueryTest"); // OR検索に適用します query.Or(new NCMBQuery[2]{ q1, q2 }); var items = query.FetchAll();
カウント
NCMBの検索結果は1000件までしか返ってきませんが、count を指定することで何件のデータが対象であるか確認できます。これを行うには Count
メソッドを使います。
var query = new NCMBQuery("QueryTest"); var items = query .GreaterThan("number", 3) .Count() .FetchAll(); query.GetCount(); // -> 3
Count
メソッドの後で FetchAll
や FetchAllAsync
を実行してください。結果を取得した後は GetCount
で対象データ件数を取得できます。
コードについて
コードはNCMBMania/ncmb_xamarin: Xamarin SDK for NCMBにアップロードしています。ライセンスはMIT Licenseになります。
まとめ
今回紹介したNCMBQueryのメソッドは高度にデータストアを使いこなす上で必要になります。ぜひ使い方を覚えてデータストアを便利に使ってください。