Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to query by creationDate in CloudKit?

I want to fetch the last X minutes of public/private entries from CloudKit.

I tried something in this effect but failed:

    let date = NSDate(timeInterval: -60.0 * 120, sinceDate: NSDate())
    let predicate = NSPredicate(format: "creationDate > %@", date)

But this will get me data, but I'm not sure if I'm querying everything or just to some kind of cap:

    let predicate = NSPredicate(value: true)

I want to be able to query by certain amount of time. Is this possible without doing the creation sorting logic on the client side?

Here's the complete code block:

func fetchPublicData(completion: ((records:[AnyObject]) -> Void)!)
{
    let date = NSDate(timeInterval: -60.0 * 120, sinceDate: NSDate())
    let predicate = NSPredicate(format: "creationDate > %@", date)
    let query = CKQuery(recordType: "MyDataRecordType", predicate: predicate)

    let container = CKContainer.defaultContainer()
    let publicDb = container.publicCloudDatabase

    publicDb.performQuery(query, inZoneWithID: nil,
    {
        (results, error) in

        if error != nil
        {
            self.handleError(error)
        }
        else
        {
            // do stuff
        }
    })
}

Thanks.

like image 898
Genki Avatar asked Oct 23 '14 05:10

Genki


People also ask

How do I use CloudKit dashboard?

Sign in to CloudKit Console at https://icloud.developer.apple.com/. Select the CloudKit Database from the app list. From the container selection drop-down at the top of the page, choose your app's container. Click the Record Types menu item in the Schema section to open the container's schema management page.

How do I add a record to CloudKit?

From the CloudKit Desktop, select Schema > Record Types > New Type, and give it the name of Task. Adding the Task Registry Type. Once this type of record is created, we select it and start adding fields (after adding them, click on Save):


1 Answers

UPDATE 10/5/2020:

Found out my own question. You'll need to log in to CloudKit dashboard, go to Schema and make sure "Index Type" is set to queryable.

enter image description here

Here's more detailed document of what kind of NSPredicate you can use for CloudKit: https://developer.apple.com/documentation/cloudkit/ckquery#//apple_ref/doc/uid/TP40014043-CH1-SW8

Once setup, you'll be able to query by date like so:

let date = NSDate(timeInterval: -60.0 * 120, sinceDate: NSDate())
let predicate = NSPredicate(format: "creationDate > %@", date)

[DEPRECATED] Screenshot of CloudKit dashboard for first accepted answer below:

enter image description here

like image 173
Genki Avatar answered Sep 21 '22 14:09

Genki