[iOS 8] CloudKit を使ってみよう (3) レコードの検索

レコードを検索しよう

前回はレコードの追加/更新/削除を行ってみました。今回はレコードの検索を行ってみたいと思います。

普通に検索する

検索のクエリは CKQuery クラスを使って定義します。コンストラクタ引数の recordType には Record Type の名前を、predicate には絞り込み条件である NSPredicate オブジェクトをセットします。あとは CKDatabase#performQuery で検索を実行します。

func search() {
    // 検索する
    var db: CKDatabase! = CKContainer.defaultContainer().privateCloudDatabase
    let predicate = NSPredicate(format: "content != %@", "nil")
    let query : CKQuery = CKQuery(recordType: "Memo", predicate: predicate)
    db.performQuery(query, inZoneWithID: nil, {
        results, error in
        println("\(results)")
    })
}

ソートして検索する

次にソートして検索してみましょう。ソートするには NSSortDescriptor オブジェクトの配列を CKQuery#sortDescriptors にセットします。次の例では、content の昇順でソートして検索しています。

func search() {
    // contentの昇順で検索する
    var db: CKDatabase! = CKContainer.defaultContainer().privateCloudDatabase
    let predicate = NSPredicate(format: "content != %@", "nil")
    let query : CKQuery = CKQuery(recordType: "Memo", predicate: predicate)
    query.sortDescriptors = [NSSortDescriptor(key: "content", ascending: true)]
    db.performQuery(query, inZoneWithID: nil, {
        results, error in
        println("\(results)")
    })
}

Record Type にはメタデータとして creationDatemodifiedDate などの Attribute が記録されています。作成日でソートするようなことはよくあると思いますが、デフォルトの設定ではこの Attribute を使ってソートすることはできません。次のようなエラーになります。

cloudkit-search01

このような場合は、Attribute の Index を設定する必要があります。Date Created の Sort にチェックを入れましょう。

これでようやくソートして検索することができます。

func search() {
    // 検索する
    var db: CKDatabase! = CKContainer.defaultContainer().privateCloudDatabase
    let predicate = NSPredicate(format: "content != %@", "nil")
    let query : CKQuery = CKQuery(recordType: "Memo", predicate: predicate)
    query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    db.performQuery(query, inZoneWithID: nil, {
        results, error in
        println("\(results)")
    })
}

まとめ

今回はレコードの検索を取り上げました。大事なことはただひとつ、ソートするときは CloudKit Dashboard で Index を指定する必要があるということです。これさえ忘れなければ正しく検索できるはずです!