2017-03-22 49 views
1

我试图在用户点击按钮时实现更新Firebase数据库。当用户登录时(在我的情况下用Facebook),数据结构已成功创建,并且数据树中的初始值已创建。使用Swift更新Firebase中的子值

我想要完成的是一旦用户在应用程序中,他们创建一个新的项目将其保存到数据库,因此更新下一个已创建的子值的值。查看我的代码和截图以供参考 - 感谢您的帮助!

// user taps button to send item to be updated in Firebase data tree 
func confirmAddPlace() { 

    // add place to tableview array 
    let accessToken = FBSDKAccessToken.current() 
    guard let accessTokenString = accessToken?.tokenString else { return } 

    let credentials = FIRFacebookAuthProvider.credential(withAccessToken: accessTokenString) 
    FIRAuth.auth()?.signIn(with: credentials, completion: { (user, error) in 
     if error != nil { 
      print("Something went wrong with our FB user: ", error ?? "") 
      return 
     } 

    guard let uid = user?.uid else { 
     return 
    } 
    // here is where i am having issues 
    let ref = FIRDatabase.database().reference().root.child("Users").child(uid).child("Places") 
    let values = ["place": self.placeNameLabel.text] 
    ref.updateChildValues(values) 
}) 

    animateOut() 
} 

enter image description here

func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) { 
     let placeID = place.placeID 
     placesClient.lookUpPlaceID(placeID, callback: { (place, error) -> Void in 
      if let error = error { 
       print("lookup place id query error: \(error.localizedDescription)") 
       return 
      } 
      guard let place = place else { 
       return 
      } 
     }) 
     let selectedPlace = place.formattedAddress 
     if let name = selectedPlace as String! 
     { 
      self.placeNameLabel.text = "Are you sure you would like to add \(name) to your places?" 
     } 
    } 

回答

3

你想改变的Places的价值,这是在child(uid)孩子的价值。

let values = ["place": self.placeNameLabel.text] 
let ref = FIRDatabase.database().reference().root.child("users").child(uid).updateChildValues(["Places": values]) 
+0

谢谢!这有助于我尝试的一件事。添加一些但是...我试图创建一个项目,每当用户添加一个新的地方数组...所以不只是更新相同的子值,以及只保存一部分字符串到数据库。我在帖子中添加了额外的代码,用于在用户从GMSAutocompleteViewController ....选择后传递的内容,所以我只想将名称值保存到Firebase。再次感谢! – user3708224

0

user3708224 - 你可以试试这个:

let values = ["place": self.placeNameLabel.text] 
// create a child reference that uses a date as the key 
let date = Date() 
let ref = FIRDatabase.database().reference().root.child("users").child(uid).child(date).updateChildValues(["Places": values]) 

如果你想要的是什么成分Date对象更多的控制试试这个:

let calendar = Calendar.current 
let year = calendar.component(.year, from: date) 

// you can do the same with [.month, .day, .hour, .minute, and more] 
// This will allow you to have control of how frequently they can update the DB 
// And it will allow you to sort by date 

如果你想上传以Firebase作为字符串尝试此操作:

/** 
This function returns the Date as a String 
- "Year-Month-Day" 
If the character '/' is used in place of ' - ' Firebase will make each component child of the previous component. 
*/ 
func getDate() -> String { 
     let date = Date() 
     let calendar = Calendar.current 
     // hours + min: -\(calendar.component(.hour, from: date))-\(calendar.component(.minute, from: date)) 
     return "\(calendar.component(.year, from: date))-\(calendar.component(.month, from: date))-\(calendar.component(.day, from: date))" 

    } 

let values = ["place": self.placeNameLabel.text] 
let ref = FIRDatabase.database().reference().root.child("users").child(uid).child(getDate()).updateChildValues(["Places": values])