รับค่าจาก CKRecord.Reference ใน CloudKit

ฉันมี 2 recordType: userDetails และคำขอซึ่งมีหนึ่งฟิลด์ในคำขออ้างอิงถึง userDetails ฉันสงสัยว่าถ้าฉันดึงบันทึกจากคำขอเพื่อรับฟิลด์อ้างอิงแล้วรับค่าที่เหลือจากการอ้างอิงที่มีเฉพาะใน userDetails เช่นชื่อผู้ใช้จะเป็นไปได้หรือไม่ หรือมีวิธีใดที่ฉันสามารถบรรลุสิ่งนั้นได้โดยไม่ต้องทำการดึงข้อมูลอื่น

ฉันลองสิ่งนี้:

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!)
  }
}

แต่มีข้อผิดพลาด:

การยกเลิกแอปเนื่องจากข้อยกเว้นที่ไม่ถูกตรวจจับ 'NSUnknownKeyException' เหตุผล: '[‹CKReference 0x600002034280› valueForUndefKey:]: คลาสนี้ไม่สอดคล้องกับการเข้ารหัสค่าคีย์สำหรับชื่อผู้ใช้คีย์'

ขอบคุณสำหรับความช่วยเหลือและข้อเสนอแนะ


person Faruuq    schedule 25.11.2020    source แหล่งที่มา


คำตอบ (1)


ฉันสมมติว่าคุณบันทึกข้อมูลอ้างอิงเช่นนี้:

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

คุณได้ลองใช้การอ้างอิงที่ดึงมาเป็นเพรดิเคตแล้วหรือยัง?

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