[iOS 8] CloudKit を使ってみよう (2) レコードの追加/更新/削除

CloudKit ストレージを使ってみよう

前回は、CloudKit の概要について解説しました。CloudKit がどういった場面で使えるのかお分かりいただけたかと思います。今回は、CloudKit ストレージを使ってデータを追加、更新、削除する処理の実装方法を解説したいと思います。

プロジェクトの設定

アプリから CloudKit ストレージを利用するためには、プロジェクトの設定の Capabilities で CloudKit ストレージを有効化する必要があります。

cloudkit01-v2

CKContainer と CKDatabase

CloudKit では、コンテナでデータを管理します。コンテナはアプリ用の iCloud ストレージに割り振られ、そのアプリ専用のコンテナとして機能します。コンテナを操作するには CKContainer クラスのインスタンスを使います。defaultContainer() を呼び出すと、アプリ用の CKContainer インスタンスが取得できます。

さて、CloudKit ストレージにはパブリックなデータベースとプライベートなデータベースの2種類のデータベースが用意されています。それぞれ publicCloudDatabaseprivateCloudDatabase で取得できます。パブリックなデータベースはアプリを利用しているすべてのユーザーが利用することができますが、プライベートなデータベースはユーザーが iCloud アカウントを設定していないと利用できません。

それぞれ、次のように取得します。

// パブリックなデータベースを参照
let publicDatabase : CKDatabase = CKContainer.defaultContainer().publicCloudDatabase
// プライベートなデータベースを参照
let privateDatabase : CKDatabase = CKContainer.defaultContainer().privateCloudDatabase

CloudKit Dashboard で Record Type を定義する

CloudKit ストレージを利用してレコードの追加や削除を行いたい場合、まず Record Type というものをコンテナ内に定義しなければいけません。というわけで、まず CloudKit Dashboard を開きます。プロジェクト設定の「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 アプリなどはすぐ作れそうですね。次は、検索機能について触れたいと思います。

参考