[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 にはメタデータとして creationDate や modifiedDate などの Attribute が記録されています。作成日でソートするようなことはよくあると思いますが、デフォルトの設定ではこの Attribute を使ってソートすることはできません。次のようなエラーになります。
このような場合は、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 を指定する必要があるということです。これさえ忘れなければ正しく検索できるはずです!