Dapatkan nilai dari CKRecord.Reference di CloudKit

Saya memiliki 2 recordType: userDetails dan permintaan di mana satu bidang permintaan merujuk ke userDetails. Saya bertanya-tanya apakah saya mengambil catatan dari permintaan untuk mendapatkan bidang referensi, dan kemudian mendapatkan nilai lainnya dari referensi yang hanya tersedia di UserDetails seperti nama pengguna, apakah itu mungkin? Atau adakah cara agar saya bisa mencapainya tanpa melakukan pengambilan data lagi?

Saya mencoba ini:

CKContainer.default().publicCloudDatabase.fetch(withRecordID: CKRecord.ID(recordName: "0A38D024-C191-436E-8622-AE7527805CE8")) { (fetched, error) in
   if fetched != nil {
      let a = fetched?.value(forKey: "requesterReferenceId") as? CKRecord.Reference
      let b = a?.recordID.value(forKey: "userName") as? String
      print(b!)
  }
}

Tapi mendapat kesalahan:

Menghentikan aplikasi karena pengecualian 'NSUnknownKeyException' yang tidak tertangkap, alasan: '[‹CKReference 0x600002034280› valueForUndefinisiKey:]: kelas ini tidak sesuai dengan pengkodean nilai kunci untuk nama pengguna kunci.'

Hargai bantuan dan saran apa pun.


person Faruuq    schedule 25.11.2020    source sumber


Jawaban (1)


Saya berasumsi Anda menyimpan referensi seperti ini:

let userDetail = CKRecord(recordType: "UserDetail")
let request = CKRecord(recordType: "Request")
let reference = CKRecord.Reference(recordID: userDetail.recordID, action: .deleteSelf)
request["requesterReferenceId"] = reference as CKRecordValue

Sudahkah Anda mencoba menggunakan referensi yang diambil sebagai predikat?

let publicDatabase = CKContainer.default().publicCloudDatabase
publicDatabase.fetch(withRecordID: CKRecord.ID(recordName: "0A38D024-C191-436E-8622-AE7527805CE8")) { (fetched, error) in
    if fetched != nil {
        if let reference = fetched?.value(forKey: "requesterReferenceId") as? CKRecord.Reference {
            let predicate = NSPredicate(format: "recordID == %@", reference)
            let query = CKQuery(recordType: "UserDetail", predicate: predicate)
            let queryOperation = CKQueryOperation(query: query)
            queryOperation.desiredKeys = ["list any keys you want to fetch here"]
            queryOperation.recordFetchedBlock = { (record: CKRecord?) -> Void in
                if let record = record {
                    print(record)
                }
                
            }
            
            queryOperation.queryCompletionBlock = { (cursor: CKQueryOperation.Cursor?, error: Error?) -> Void in
                if let error = error {
                    print(error)
                    return
                }
                
            }
            publicDatabase.add(queryOperation)
        }
    }
}
person Kevvv    schedule 25.11.2020