2016-07-20 3 views
2

Я пытаюсь обновить существующую запись в CloudKit, но я создаю новую запись вместо изменения значения! Здесь код:Как обновить поле в типе записи в 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) 
      } 
     } 
    } 
} 

Краткого объяснение: во-первых, я получаю Старший номер телефона (каждый старейшина имеет другой телефон) и проверить, если этот номер телефона в облаке. Если это так, то обновляет careTakerId ЭТОГО старца, в частности!

Здесь вы можете увидеть, что создание этого «No Name» запись и запись выше остается неизменной

Любые идеи?

+0

О, и не возражаю синтаксис, я использую Xcode 8 бета-2 –

ответ

3

только понял, где теперь проблема:

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

Я буквально создавая новый рекорд! Мне нужно было получить только результат переменная, то есть вектор CKRecord, а затем изменить и сохранить поле!

4

ли это самый простой способ, принести записи, обновления и сохранения:

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

Спасибо, очень полезно. – ChanWarde

 Смежные вопросы

  • Нет связанных вопросов^_^