FJCT_ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

C#用NCMB SDK(コミュニティSDK)の使い方(サブクエリ、カウントの使い方)

f:id:mbaasdevrel:20200710131602p:plain

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 メソッドの後で FetchAllFetchAllAsync を実行してください。結果を取得した後は GetCount で対象データ件数を取得できます。

コードについて

コードはNCMBMania/ncmb_xamarin: Xamarin SDK for NCMBにアップロードしています。ライセンスはMIT Licenseになります。

まとめ

今回紹介したNCMBQueryのメソッドは高度にデータストアを使いこなす上で必要になります。ぜひ使い方を覚えてデータストアを便利に使ってください。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。