2016-07-20 12 views
2

Ich versuche, einen vorhandenen Datensatz in CloudKit zu aktualisieren, aber ich erstelle einen neuen Datensatz, anstatt den Wert zu ändern! Hier ist der Code:Wie aktualisiere ich ein Feld für einen Datensatztyp in CloudKit?

func pairing(phone: String, ctid: String) { 
    ctUsers = [CKRecord]() 
    print("THE PHONE IS: \(phone)\n") 

    let publicData = CKContainer.default().publicCloudDatabase 
    let predicate = Predicate(format: "phone == %@", phone) 
    let query = CKQuery(recordType: "Elder", predicate: predicate) 

    publicData.perform(query, inZoneWith: nil) { (results: [CKRecord]?, error: NSError?) -> Void in 
     if error != nil { 
      print(error?.localizedDescription) 
     } 

     if let users = results { 
      self.ctUsers = users 
      print("\nHow many users in cloud: \(self.ctUsers.count)\n") 

      if self.ctUsers.count != 0 { 

       let user = CKRecord(recordType: "Elder") 
       user["careTakerId"] = ctid 

       let publicData = CKContainer.default().publicCloudDatabase 
       publicData.save(user, completionHandler: { (record: CKRecord?, error: NSError?) in 
        if error == nil { 

         DispatchQueue.main.asynchronously(execute: {() -> Void in 
          print("CARETAKER updated successfully\n") 
         }) 
        } 
        else { 
         print("\nHUEHUEHUEHUE\n") 
         print(error?.localizedDescription) 
        } 
       }) 
      } 
      else { 
       print("\nELDER ISN'T IN CLOUD\n") 
       print(error?.localizedDescription) 
      } 
     } 
    } 
} 

Kurze Erklärung: Zuerst Ich erhalte die ältere Telefonnummer (jeder älteren hat ein anderes Telefon) und prüfen, ob diese Telefonnummer in der Wolke ist. Wenn es ist, dann aktualisiert die careTakerId von diesem Ältesten, speziell!

Hier können Sie sehen, dass sich dieses „No Name“ Datensatz erstellt und der Datensatz oben bleibt unverändert

Irgendwelche Ideen?

+0

Oh, und nicht die Syntax nichts, ich bin Xcode 8 Beta 2 –

Antwort

3

Erst jetzt realisiert, wo ist das Problem:

publicData.perform(query, inZoneWith: nil) { (results: [CKRecord]?, error: NSError?) -> Void in 
    if error != nil { 
     print(error?.localizedDescription) 
    } 

    if let users = results { 
     self.ctUsers = users 
     print("\nHow many users in cloud: \(self.ctUsers.count)\n") 

     if self.ctUsers.count != 0 { 

      let user = users.first //CKRecord(recordType: "Elder") 
      user?["careTakerId"] = ctid 

      let publicData = CKContainer.default().publicCloudDatabase 
      publicData.save(user, completionHandler: { (record: CKRecord?, error: NSError?) in 
       if error == nil { 

        DispatchQueue.main.asynchronously(execute: {() -> Void in 
         print("CARETAKER updated successfully\n") 
        }) 
       } 
       else { 
        print("\nHUEHUEHUEHUE\n") 
        print(error?.localizedDescription) 
       } 
      }) 
     } 
     else { 
      print("\nELDER ISN'T IN CLOUD\n") 
      print(error?.localizedDescription) 
     } 
    } 
} 

ich buchstäblich einen neuen Rekord zu schaffen! Ich musste nur auf die Ergebnisse Variable zugreifen, das ist ein Vektor von CKRecord und dann ändern und speichern Sie das Feld!

4

es einfachste Art und Weise tun, holen den Rekord, aktualisieren und speichern:

let recordID = CKRecordID(recordName: "[record_name_here]") 

    database.fetch(withRecordID: recordID) { record, error in 

     if let record = record, error == nil { 

      //update your record here 

      self.database.save(record) { _, error in 
       completion?(error) 
      } 
     } 
    } 
+0

Dank Verwendung sehr nützlich. – ChanWarde

Verwandte Themen