更新firebase中字典中的单个值 - Swift项目 [英] Updating a single value in a dictionary in firebase - Swift project

查看:146
本文介绍了更新firebase中字典中的单个值 - Swift项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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

  {
用户:{
08e5443c- cdde-4fda-8733-8c4fce75dd34:{
BusinessName:looliCake,
Category:Cooking,
City:Riyadh,
ContactMe:05551233210,
Details:许多flaiver选择,
Email:loolicack@gmail.com,
PhoneNumber:05551233210,
Provider:123,
ShortDescription:有史以来最好的流行蛋糕,
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?字符串



@IBAction func EditEmail(发件人:AnyObject){

如果EmailAddressTF.text ==
{
let alert = UIAlertController(title:Oops!,message:确保填写所有必需的文本框,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,密码:mainpass,toNewEmail:self.EmailAddressTF.text,withCompletionBlock:{error in

if error!= nil {

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

switch(errorCode ){
case .EmailTaken:
print(Email taken)
let alert = UIAlertController(title:Oops!,留言: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){}


。 NetworkError:
print(网络错误)
let alert = UIAlertController(title:Oops!,message:Network error,check your connection,preferredStyle:.Alert)
alert.addAction(UIAlertAction(title:OK,style:.Default){ _ b} b $ self_presentViewController(alert,animated:true){}
$ b默认值:
print(未知错误)
let alert = UIAlertController title:Oops!,message:Unknown Error,preferredStyle:.Alert)
alert.addAction(UIAlertAction(title:OK,style:.Default){_in})
self .presentViewController(alert,animated:true){}
}
}




$ b} else {

NSUserDefaults.standardUserDefaults()。setValue(self.EmailAddressTF.text,forKey:Email)
print(Email更改成功)

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.naviga tionController?.popViewControllerAnimated(true)

}

})

} // Big Else


}



} // EditEmailButton



$ b @IBAction func EditPassword(sender:AnyObject ){

如果PasswordTF.text ==
{
let alert = UIAlertController(title:Oops!,message:确保填写所有必需的文本框,preferredStyle:.Alert)
alert.addAction(UIAlertAction(title:OK,style:.Default){_in})
self.presentViewController(alert,animated:true){}


$ $ b $如果RepasswordTF.text!= PasswordTF.text
{
let alert = UIAlertController(title:Oops!,message: 您输入了不同的密码,preferredStyle:.Alert)
alert.addAction(UIAlertAction(title:OK,style:.Default){_in})
self.presentViewController(alert,animated: TR ue){}
}
else {


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

(ErrorType) - >如果ErrorType!= nil {
print(ErrorType)
print(处理请求时出现错误)
无效

else
{

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

}



$ b 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){
$ b $ if BusinessNameTF.text ==
{
let alert = UIAlertController(title:Oops!,message:确保填充所有需要的文本框,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)

}



$ b $ p
$ b在每个按钮中,我正在更新Firebase中的整个字典!这是错误的!

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

解决方案

这个问题和答案在评论中帮了我。由于没有官方回答的问题,我将添加一个更新后的代码,因为评论中的代码已被废弃。

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

这对我来说是完美的。


I'm working on iOS application using swift and firebase. I'm trying to let the user change his email and password and the rest of his information stored in firebase in the same view controller using separate buttons.

Here's example of one user from the dashboard:

    {
     "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/"
        }
      }
    }

Here's the code:

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)

    }
}

In each button, I'm updating the entire dictionary in firebase! Which's wrong!

How can I update in firebase only the email value in email button, and provider in password button?

解决方案

This question and answer in the comments helped me out. Since there isn't an official answered question, I will add one with updated code cause the one in the comments is deprecated.

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

This worked perfectly for me.

这篇关于更新firebase中字典中的单个值 - Swift项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆