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で慣れている方にとっては使いやすい機能でしょう。