[iOS 8] CloudKit を使ってみよう (2) レコードの追加/更新/削除
CloudKit ストレージを使ってみよう
前回は、CloudKit の概要について解説しました。CloudKit がどういった場面で使えるのかお分かりいただけたかと思います。今回は、CloudKit ストレージを使ってデータを追加、更新、削除する処理の実装方法を解説したいと思います。
プロジェクトの設定
アプリから CloudKit ストレージを利用するためには、プロジェクトの設定の Capabilities で CloudKit ストレージを有効化する必要があります。
CKContainer と CKDatabase
CloudKit では、コンテナでデータを管理します。コンテナはアプリ用の iCloud ストレージに割り振られ、そのアプリ専用のコンテナとして機能します。コンテナを操作するには CKContainer クラスのインスタンスを使います。defaultContainer() を呼び出すと、アプリ用の CKContainer インスタンスが取得できます。
さて、CloudKit ストレージにはパブリックなデータベースとプライベートなデータベースの2種類のデータベースが用意されています。それぞれ publicCloudDatabase と privateCloudDatabase で取得できます。パブリックなデータベースはアプリを利用しているすべてのユーザーが利用することができますが、プライベートなデータベースはユーザーが iCloud アカウントを設定していないと利用できません。
それぞれ、次のように取得します。
// パブリックなデータベースを参照 let publicDatabase : CKDatabase = CKContainer.defaultContainer().publicCloudDatabase // プライベートなデータベースを参照 let privateDatabase : CKDatabase = CKContainer.defaultContainer().privateCloudDatabase
CloudKit Dashboard で Record Type を定義する
CloudKit ストレージを利用してレコードの追加や削除を行いたい場合、まず Record Type というものをコンテナ内に定義しなければいけません。というわけで、まず CloudKit Dashboard を開きます。プロジェクト設定の「CloudKit Dashboard」をクリックするとブラウザで開くことができます。
初期表示は右メニューの Schema から Record Types が選択されていると思うので、ここから「+」をクリックします。
レコード名は必須なので必ず入力します。Attribute はカラムにあたりますが、今回は content という String 型の Attribute を定義しました。最後に右下の「Save」を忘れずにクリックして保存してください。
以上で Record Type の定義は完了です。この Record Type を対象にレコードの操作を行っていきます。
レコードの操作
レコードの操作は CKRecord クラスを使います。CKRecord オブジェクトを新しく作ることでレコードを追加したり、データベースから取得してきた CKRecord オブジェクトを使って更新したり、削除したりすることができます。
レコードの追加
レコードを追加するには、CKRecord オブジェクトを生成し、CKDatabase オブジェクトの saveRecord:completionHandler: を呼びます。CKRecord オブジェクト生成時にはテーブル名にあたる recordType を指定します。また、setObject で値を自由にセットできます。
// レコードを新規作成する let record = CKRecord(recordType: "Memo") record.setObject("あいうえお", forKey: "content") // レコードを保存する database.saveRecord(record) { record, error in if error == nil { // 成功 println("Saved : \(record)") } else { // 失敗 println("Error : \(error)") } }
レコードの更新
レコードの更新には、まず対象の CKRecord オブジェクトの recordID を元に fetchRecordWithID:completionHandler: を呼びます。コールバックで受け取った CKRecord オブジェクトの値を変えたあと saveRecord:completionHandler: を呼びます。なお、レコードの検索方法についてはこの記事では割愛します。
database.fetchRecordWithID(existRecord.recordID, completionHandler: { record, error in // レコードを更新する record.setObject("かきくけこ", forKey: "content") // レコードを保存する database.saveRecord(record) { record, error in if error == nil { // 成功 println("Updated : \(record)") } else { // 失敗 println("Error : \(error)") } } }
2015/03/10 レコードの更新方法について内容を修正しました。ご指摘頂きました Jin Eq さん、誠にありがとうございました!
レコードの削除
レコードの削除は CKDatabase オブジェクトの deleteRecordWithID:completionHandler: を呼びます。第一引数には削除対象のレコードの CKRecordID を渡します。
// レコードを削除する database.deleteRecordWithID(record.recordID) { recordId, error in if error == nil { // 成功 println("Deleted : \(recordId)") } else { // 失敗 println("Error : \(error)") } }
まとめ
CloudKit の事始めということで、レコードの追加・削除・更新というオーソドックスなクエリを実行してみました。これにあとは検索を加えるだけで、iCloud を使った TODO アプリなどはすぐ作れそうですね。次は、検索機能について触れたいと思います。