この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
レコードを検索しよう
前回はレコードの追加/更新/削除を行ってみました。今回はレコードの検索を行ってみたいと思います。
普通に検索する
検索のクエリは 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 を指定する必要があるということです。これさえ忘れなければ正しく検索できるはずです!