FlutterはDartで書かれたフレームワークになります。元々iOSやAndroidといったスマートフォン向けでしたが、今ではWebやWindows、macOSといったマルチプラットフォームで動作します。Flutter/Dartを覚えることで、多くの環境に対してアプリケーション開発が可能になります。
NCMBでは公式SDKを提供していませんが、非公式に開発を進めているFlutter SDKがあります。だいたいの機能は実装してきましたが、今回サブクエリに対応しました。より複雑なデータ取得方法に利用できますので、覚えておくと便利な場面があるかも知れません。
インストール
flutter pub get ncmb
でインストールできます。
使い方
任意のファイル上でライブラリを読み込みます。
import 'package:ncmb/ncmb.dart';
そしてNCMBオブジェクトを初期化します。
NCMB('APPLICATION_KEY', 'CLIENT_KEY');
サブクエリについて
データストアのクラス同士でデータを連係させる場合、二つの方法が用意されています。
- ポインター
- リレーション
ポインターは1対n、リレーションはn対nのデータ関係性において利用が可能です。しかし、データ連係を行わずに各クラスにデータを投入してしまっている場合もあるでしょう。そこで使ってみたいのがサブクエリです。
通常の方法
例えば以下のようなデータを考えてみます。
Groupクラス
name |
---|
Group 1 |
Group 2 |
Group 3 |
Memberクラス
Group | name |
---|---|
Group 1 | Test 1 |
Group 1 | Test 2 |
Group 1 | Test 3 |
Group 2 | Test 4 |
Group 2 | Test 5 |
Group 2 | Test 6 |
リレーションやポインターがない状態ですと、例えば以下のような検索方法が考えられます。
var groupQuery = new NCMBQuery('Group');
groupQuery.equalTo('name', 'Group2');
// データ取得(クエリ実行)
var group = await groupQuery.fetch();
var memberQuery = new NCMBQuery('Member');
memberQuery.equalTo('Group', group.name)
// データ取得(クエリ実行)
var members = await memberQuery.fetchAll();
print(members);
この場合の問題点としては、クエリを2回実行しているということです。そのため、APIの消費量はもちろん、ネットワークの遅延も発生します。
サブクエリの利用
サブクエリを使った場合、次のようなコードになります。データを取得する fetchAll
は1回しか実行していません。
var groupQuery = new NCMBQuery('Group');
groupQuery.equalTo('name', 'Group 2');
var memberQuery = new NCMBQuery('Member');
memberQuery.select('group', 'name', groupQuery);
// データ取得(クエリ実行)
var members = await memberQuery.fetchAll();
見て分かる通り、グループについては検索を実行していません。その状態でメンバークラスのselectメソッドを使います。そうすることでグループの検索結果を用いて、その条件にマッチするデータを取り出すことができます。
ポインターやリレーションでも同じような操作はできますが、より柔軟な検索が可能です。
まとめ
mBaaSのようなNoSQL型のデータベースを使いつつもデータをリレーショナルに管理したいという要望は根強くあります。そうした時にはポインターやリレーションを使ったり、さらにサブクエリを使うことで柔軟なデータ抽出が実現できるでしょう。
NCMBのDart/Flutterパッケージはncmb | Dart Packageにて公開しています。ぜひ試してみてください!