NCMB(ニフクラ mobile backend)では各種プラットフォーム向けにSDKを出していますが、今回はSwift SDKに関する記事です。まだ開発途中ということもあって、実装されていない機能もあります(執筆時点でのバージョンは1.2.0です)。今回はデータストア(クラウドデータベース)におけるポインター(データを1対1の関係で連携させるもの)の使い方を紹介します。
ポインターとは
ポインターはあるデータと別なデータを1対1の関係で連携させるものです。個人データにおける住所の都道府県マスタと連携させるようなイメージです。
データ形式は次のようになっており、他の一般的なデータ形式(文字列や数字など)と比べると特殊です。
{
"__type": "Pointer",
"className": "連携先のデータストアクラス名",
"objectId": "連携先のデータのユニークID"
}
このフォーマットに従ってデータを保存すれば、ポインターが扱えるようになります。
今回のプロジェクト
今回は言語がSwift、インタフェースがSwiftUI、ライフサイクルはSwiftUI Appとしています。
SDKのインストール
FileメニューからSwift Packages > Add Package Dependencyと選択します。
出てきたダイアログでSwift SDKのGitリポジトリURLを入力します。GitHubのリポジトリでHTTPSとして取得できるもの、または下記URLになります。
https://github.com/NIFCLOUD-mbaas/ncmb_swift.git
バージョンは最新のものでかまいません。
後はFinishボタンを押せば完了です。
初期化
今回はSwiftUIを利用しています。ライフサイクルもSwiftUIです。
まずSDKをインポートします。
import SwiftUI
import NCMB
次に scenePhase
を追加します。
@main
struct forumApp: App {
// 追加
@Environment(\.scenePhase) private var scenePhase
後は body 内で onChange
を使って初期化します。
var body: some Scene {
WindowGroup {
ContentView()
}.onChange(of: scenePhase) { scene in
switch scene {
case .active:
// キーの設定
let applicationKey = "YOUR_APPLICATION_KEY"
let clientKey = "YOUR_CLIENT_KEY"
// 初期化
NCMB.initialize(applicationKey: applicationKey, clientKey: clientKey)
case .background: break
case .inactive: break
default: break
}
}
}
ポインターのデータ保存
今回は掲示板のようなスレッドクラス(Thread)に幾つかのコメントクラス(Comment)が紐付く形とします。コメントクラスを保存する際に、スレッドクラスのデータをDictionary型で定義します。
comment["thread"] = [
"objectId": (thread["objectId"] ?? "") as String,
"__type": "Pointer",
"className": "Thread"
]
comment.save()
ポインターのデータを使って検索
あるスレッドに紐付くコメントを一覧で取得したい場合、検索条件にスレッドクラスを用います。この時も、ポインターのデータ型にして指定すると、希望した結果が取得できます。
var query = NCMBQuery.getQuery(className: "Comment")
query
.where(field: "thread", equalTo: [
"objectId": (thread["objectId"] ?? "") as String,
"__type": "Pointer",
"className": "Thread"
])
let results = query.find()
まとめ
ポインター型を使えば、データ同士の結びつきが表現できます。本当は include というメソッドを用意してコメントクラスからスレッドクラスを含めて取得することもできるのですが、まだ用意されていません。これは、今後のバージョンアップで実装されるはずです。また、ポインターの扱いについても、もっと手軽になると思います。
現状のSwift SDKでポインターデータを扱う際には、こちらを参考にしてください。