首页 文章

更新firebase中字典中的单个值 - Swift项目

提问于
浏览
5

我正在使用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中仅更新电子邮件按钮中的电子邮件值,以及密码按钮中的提供者?

3 回答

  • 0

    评论中的这个问题和答案帮助了我 . 由于没有正式回答的问题,我将添加一个更新的代码,因为评论中的一个已被弃用 .

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

    这对我很有用 .

  • 24

    您可以直接导航到要更新的单个值,然后使用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)
    
    }
    

    //添加一个更新的按钮名称或whatEver,并将其作为Action连接

    @IBAction func updateData(_ sender: Any) {
    
        DBprovider.instance.DBRef.child("Data").child(key.key).child("id").setValue(111)
    
    
    }
    
  • 1
    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...")
                    }
                }
    

相关问题