【问题标题】:Updating a single value in a dictionary in firebase - Swift project在 firebase 的字典中更新单个值 - Swift 项目
【发布时间】:2016-08-25 15:44:30
【问题描述】:

我正在使用 swift 和 firebase 开发 iOS 应用程序。 我试图让用户使用单独的按钮更改他的电子邮件和密码以及存储在同一视图控制器中的 firebase 中的其余信息。

以下是仪表板中一位用户的示例:

    {
     "Users" : {
       "08e5443c-cdde-4fda-8733-8c4fce75dd34" : {
         "BusinessName" : "looliCake",
         "Category" : "Cooking",
         "City" : "Riyadh",
         "ContactMe" : "05551233210",
         "Details" : "many flaiver choose",
         "Email" : "loolicack@gmail.com",
         "PhoneNumber" : "05551233210",
         "Provider" : "123",
         "ShortDescription" : "best pop cake ever . ",
         "Website1" : "www.looliCack.com",
         "Website2" : "https://www.instagram.com/loolicack/"
        }
      }
    }

代码如下:

let mainpass = NSUserDefaults.standardUserDefaults().objectForKey("password") as? String
let mainEmail = NSUserDefaults.standardUserDefaults().objectForKey("Email") as? String



@IBAction func EditEmail(sender: AnyObject) {

    if EmailAddressTF.text==""
    {
        let alert = UIAlertController(title: "Oops!", message:"Make sure to fill in all required textfields", preferredStyle: .Alert)
        alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
        self.presentViewController(alert, animated: true){}
    }
    else
    {
        let isEqu = (mainEmail == self.EmailAddressTF.text)
        if(isEqu == true) {

        } else {
            let ref = Firebase(url: "https://businesswallet.firebaseio.com/")

            ref.changeEmailForUser(mainEmail, password: mainpass, toNewEmail: self.EmailAddressTF.text, withCompletionBlock: { error in

                if error != nil {

                    if let errorCode = FAuthenticationError(rawValue: error.code) {

                        switch (errorCode) {
                        case .EmailTaken:
                            print("Email taken")
                            let alert = UIAlertController(title: "Oops!", message:"Sorry,Email taken", preferredStyle: .Alert)
                            alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
                            self.presentViewController(alert, animated: true){}

                        case .InvalidEmail:
                            print("invalid email")
                            let alert = UIAlertController(title: "Oops!", message:"invalid email", preferredStyle: .Alert)
                            alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
                            self.presentViewController(alert, animated: true){}


                        case .NetworkError:
                            print("Network Error")
                            let alert = UIAlertController(title: "Oops!", message:"Network error, check your connection", preferredStyle: .Alert)
                            alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
                            self.presentViewController(alert, animated: true){}

                        default:
                            print("Unknown Error")
                            let alert = UIAlertController(title: "Oops!", message:"Unknown Error", preferredStyle: .Alert)
                            alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
                            self.presentViewController(alert, animated: true){}
                        }
                    }





                } else {

                    NSUserDefaults.standardUserDefaults().setValue(self.EmailAddressTF.text, forKey: "Email")
                    print("Email changed successfully")

                    let newUser = [
                        "Provider": self.PasswordTF.text!,
                        "Email": self.EmailAddressTF.text,
                        "BusinessName": self.BusinessNameTF.text ,
                        "ShortDescription" : self.ShortDescriptionTF.text,
                        "Category" : self.itemSelected,
                        "City" : self.CityTF.text,
                        "ContactMe" : self.ContactMeTF.text,
                        "PhoneNumber" : self.PhoneNumberTF.text,
                        "Website1": self.Website1TF.text,
                        "Website2": self.Website2TF.text,
                        "Details": self.DetailsTV.text
                    ]


                    self.ref.childByAppendingPath("Users").childByAppendingPath(self.ref.authData.uid).updateChildValues(newUser)
                    self.navigationController?.popViewControllerAnimated(true)

                }

            })

        } //Big Else


    }



} //EditEmailButton




@IBAction func EditPassword(sender: AnyObject) {

    if  PasswordTF.text==""
    {
        let alert = UIAlertController(title: "Oops!", message:"Make sure to fill in all required textfields", preferredStyle: .Alert)
        alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
        self.presentViewController(alert, animated: true){}
    }
    else
    {
        if RepasswordTF.text != PasswordTF.text
        {
            let alert = UIAlertController(title: "Oops!", message:"You Entered Different Passwords", preferredStyle: .Alert)
            alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
            self.presentViewController(alert, animated: true){}
        }
        else {


            ref.changePasswordForUser( NSUserDefaults.standardUserDefaults().objectForKey("Email") as? String, fromOld: NSUserDefaults.standardUserDefaults().objectForKey("password") as? String, toNew: self.PasswordTF.text)
            {

                (ErrorType) -> Void in
                if ErrorType != nil {
                    print(ErrorType)
                    print("There was an error processing the request")
                }
                else
                {

                    NSUserDefaults.standardUserDefaults().setValue(self.PasswordTF.text, forKey: "password")
                    print("Password changed successfully")

                }

            }


            let newUser = [
                "Provider": self.PasswordTF.text!,
                "Email": self.EmailAddressTF.text,
                "BusinessName": self.BusinessNameTF.text ,
                "ShortDescription" : self.ShortDescriptionTF.text,
                "Category" : self.itemSelected,
                "City" : self.CityTF.text,
                "ContactMe" : self.ContactMeTF.text,
                "PhoneNumber" : self.PhoneNumberTF.text,
                "Website1": self.Website1TF.text,
                "Website2": self.Website2TF.text,
                "Details": self.DetailsTV.text
            ]


            self.ref.childByAppendingPath("Users").childByAppendingPath(self.ref.authData.uid).updateChildValues(newUser)
            self.navigationController?.popViewControllerAnimated(true)

        }


    } //else


}



@IBAction func EditBusinessInfo(sender: AnyObject) {

    if BusinessNameTF.text==""
    {
        let alert = UIAlertController(title: "Oops!", message:"Make sure to fill in all required textfields", preferredStyle: .Alert)
        alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
        self.presentViewController(alert, animated: true){}
    }
    else
    {

        let newUser = [
            "Provider": self.PasswordTF.text!,
            "Email": self.EmailAddressTF.text,
            "BusinessName": self.BusinessNameTF.text ,
            "ShortDescription" : self.ShortDescriptionTF.text,
            "Category" : self.itemSelected,
            "City" : self.CityTF.text,
            "ContactMe" : self.ContactMeTF.text,
            "PhoneNumber" : self.PhoneNumberTF.text,
            "Website1": self.Website1TF.text,
            "Website2": self.Website2TF.text,
            "Details": self.DetailsTV.text
        ]


        self.ref.childByAppendingPath("Users").childByAppendingPath(self.ref.authData.uid).updateChildValues(newUser)
        self.navigationController?.popViewControllerAnimated(true)

    }
}

在每个按钮中,我都在更新 firebase 中的整个字典!哪里不对!

如何在 firebase 中仅更新电子邮件按钮中的电子邮件值, 和密码按钮中的提供者?

【问题讨论】:

  • 我确实通过添加解决了这个问题: self.ref.childByAppendingPath("Users").childByAppendingPath(self.ref.authData.uid).updateChildValues(["Email":self.EmailAddressTF.text !]) 在电子邮件按钮而不是字典中。
  • 并在密码中添加:self.ref.childByAppendingPath("Users").childByAppendingPath(self.ref.authData.uid).updateChildValues(["Provider":self.PasswordTF.text!])按钮而不是字典。

标签: ios swift dictionary firebase


【解决方案1】:

cmets中的这个问题和答案帮助了我。由于没有官方回答的问题,我将添加一个带有更新代码的问题,因为不推荐使用 cmets 中的那个。

ref.child("yourKey").child("yourKey").updateChildValues(["yourKey": yourValue])

这对我来说非常有效。

【讨论】:

  • 太棒了!祝你好运!
【解决方案2】:

您可以简单地导航到要更新的单个值,然后使用 setValue(在这里给它值) 这是一个非常简单的例子:

var key : FIRDatabaseReference!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    addData()
}



func addData()
{

    var data :Dictionary<String,Any> = ["name":"nawal","id":123]
   key =  DBprovider.instance.DBRef.child("Data").childByAutoId()
    key.setValue(data)

}

//添加一个按钮名称它更新或whatEr并将其连接为Action

@IBAction func updateData(_ sender: Any) {

    DBprovider.instance.DBRef.child("Data").child(key.key).child("id").setValue(111)


}

【讨论】:

    【解决方案3】:
      let path1 = FirebaseBaseUrl + "users/" + id
                let chilRef1 = FIRDatabase.database().referenceFromURL(path1)
                // chilRef1.updateChildValues(["status": "online"])
    
                chilRef1.updateChildValues(["status": "offline"]) { (error, ref) in
                    if(error != nil){
                        print("Error",error)
                    }else{
                        print("\n\n\n\n\nYou are Offline...")
                    }
                }
    

    【讨论】:

      【解决方案4】:

      此代码在 swift 4 和 5 中运行

      func updateAnyFirebaseVale(_ param :  String){
      
          if let id = self.currentId{
      
              let val =  Database.database().reference(fromURL:
                  "Your_URL").child("CHILD NODE NAME").child("ID YOU WANT TO UPDATE ")
      
              val.updateChildValues(["specific param name to update like password name etc" : "value of param"])
      
              let alert = UIAlertController(title: "Message Header", message: "", preferredStyle: .alert)
      
              alert.addAction(UIAlertAction(title: "Done", style: .default, handler: { (alert) in
      
      
              }))
      
              self.present(alert,animated: true)
      
      }
      

      【讨论】:

        猜你喜欢
        • 2019-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        • 2017-08-05
        • 2011-05-13
        相关资源
        最近更新 更多