How would I query CloudKit for a specific record by its recordName?

772 Views Asked by At

How would I query CloudKit for a specific record by its recordName?

The following code gives me an error.

let recordName = "BBBA9068-D01A-9D55-3D6B-4460A7B36D57"
let predicate = NSPredicate(format: "recordID=%@", recordName)
let query = CKQuery(recordType: "Route", predicate: predicate)

privateDatabase.perform(query, inZoneWith: nil) {

    (records: [CKRecord]?, error: Error?) in

    if error != nil {

        print(error!.localizedDescription)

    } else {

        if let records = records {

            print(records.first as Any)

        }

    }

}

The debug window shows:

Field '___recordID' has a value type of REFERENCE and cannot be queried using filter value type STRING

2

There are 2 best solutions below

0
daniel On

I changed the first two lines of the code and got it to work.

let recordID: CKRecord.ID = CKRecord.ID(recordName: "BBBA9068-D01A-9D55-3D6B-4460A7B36D57")
let predicate = NSPredicate(format: "recordID=%@", recordID)
let query = CKQuery(recordType: "Route", predicate: predicate)

privateDatabase.perform(query, inZoneWith: nil) {

    (records: [CKRecord]?, error: Error?) in

    if error != nil {

        print(error!.localizedDescription)

    } else {

        if let records = records {

            print(records.first as Any)

        }

    }

}
0
Ahmed Elawady On

GenerateCKRecord.ID by your recordName

For one recordName you can do like that:

let recordID = CKRecord.ID(recordName: "recordName", zoneID: "Zone")

if you don't use zones, will automatically use the default zone

let recordID = CKRecord.ID(recordName: "recordName") 

For multiple recordIDs:

let recordIDs = recordNames.map { CKRecord.ID(recordName: $0) }

If you want to use predicate:

let recordIDs = recordNames.map { CKRecord.ID(recordName: $0) }
let predicate: NSPredicate = NSPredicate(format: "recordID IN %@", recordIDs)

Hopefully my answer meet your needs