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

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

SwiftでNCMBを使う(リレーション編)

f:id:mbaasdevrel:20180806093819p:plain

mBaaSで用意されているデータストアの一歩進んだ使い方です。今回はSwiftでリレーションを使う方法を解説します。

リレーションとは

リレーションはデータストア内のデータ同士を連携させるための仕組みです。似た仕組みにポインターがありますが、リレーションは1対多、または多対多の連携を行うのに対して、ポインターは1対1または1対多の連携を行います。ただし、ポインターは右側(1または多)は自分がどのデータと結びついているのか分かりません。あくまでも左側の1がデータの紐付けを管理します。

接続先になるデータを保存する

まず接続先になるデータを保存します。接続元データはすでに存在していることとします。

let task = NCMBObject.init(className: "Task")
task?.setObject(txtTask.text, forKey: "value")
task?.saveInBackground({error in
  if (error != nil) {
    print(error)
  } else {
    // 保存完了
  }
})

保存したら、そのデータを紐付けます。 relationforKey を使い、指定したキーにオブジェクトを紐付けます。

let user = NCMBUser.current()
let relation = user?.relationforKey("tasks")
relation?.add(task)
user?.saveInBackground({error in
    if (error != nil) {
        print(error)
    }
})

コツとして、紐付けを管理するrelationにデータを追加しますが、保存処理は元オブジェクトである user に行います。この書き方が分かりづらい場合は以下のようにも書けます。

user?.relationforKey("tasks").add(task)
user?.saveInBackground({error in
    if (error != nil) {
        print(error)
    }
})

データを取り出す

保存したデータを取り出す場合には query() を使って NCMBQuery を取りだし、検索を実行します。

let Query = user?.relationforKey("tasks")?.query()
Query?.findObjectsInBackground({(results, error) in
  if (error != nil) {
    print(error)
  } else {
    print(results)
  }
})

そうすると紐付けられたTaskクラスのデータが取り出せます。

Optional([{
  "value" : "Test2",
  "createDate" : {
    "__type" : "Date",
    "iso" : "2019-01-28T08:31:00.209Z"
  },
  "objectId" : "cp7M9Ty31sDbQ46R",
  "acl" : {
    "*" : {
      "write" : true,
      "read" : true
    }
  },
  "updateDate" : {
    "__type" : "Date",
    "iso" : "2019-01-28T08:31:00.210Z"
  }
}, {
  "value" : "Test1",
  "createDate" : {
    "__type" : "Date",
    "iso" : "2019-01-28T08:30:58.162Z"
  },
  "objectId" : "maTYzmDwNb5g9F1i",
  "acl" : {
    "*" : {
      "write" : true,
      "read" : true
    }
  },
  "updateDate" : {
    "__type" : "Date",
    "iso" : "2019-01-28T08:30:58.164Z"
  }
}])

保存時はリレーションを取り出して追加し、取得時にはクエリを実行するのがコツになります。データストアはリレーショナルデータベースではないのでデータ同士を連携させるのはあまり得意ではない(NoSQL型データベースの使い方ではない)のですが、普段RDBMSで慣れている方にとっては使いやすい機能でしょう。

中津川 篤司

中津川 篤司

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