我正在尝试将数据保存到 Firebase 中,但每次执行保存数据的代码时,以前的数据都会在 Firebase 中被覆盖。我尝试遵循这里的一些提示,但未能成功。
fileprivate func saveSwipeToDataBase(didLike: Any) {
let swipeDate = Int(NSDate().timeIntervalSince1970)
guard let uid = Auth.auth().currentUser?.uid else { return }
guard let cardUID = topCardView?.cardViewModel.uid else { return }
let documentData = ["userSwipeId": uid,
"didLike": didLike,
"checked": 0,
"Swipe Date": swipeDate,
"type": SWIPE_INT_VALUE] as [String : Any]
self.postJobDataIntoDatabseWithUID(uid: cardUID, values: documentData as [String : AnyObject])
}
private func postJobDataIntoDatabseWithUID(uid: String, values: [String: AnyObject]) {
let ref = Database.database().reference(fromURL: "https://oddjobs-b131f.firebaseio.com/")
ref.observe(.childAdded, with: { (snapshot) in
let usersReference = ref.child("UserSwipes").child(uid)
usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in
if err != nil {
print("error saving data into firebase")
return
}
})
}, withCancel: nil)
}
我觉得问题似乎出在 updateChildValues 上,但我可能还很遥远。感谢您的任何和所有帮助。
最佳答案
如果您想将新的子节点添加到具有自动生成(并保证唯一)ID 的位置,您需要在该位置调用 childByAutoId()
。
因此,当调用 postJobDataIntoDatabaseWithUID
时,在 /UserSwipes/$uid
下添加一个新的 chid 节点
private func postJobDataIntoDatabaseWithUID(uid: String, values: [String: AnyObject]) {
let ref = Database.database().reference(fromURL: "https://oddjobs-b131f.firebaseio.com/")
let usersReference = ref.child("UserSwipes").child(uid)
usersReference.childByAutoId().setValue(values, withCompletionBlock: { (err, ref) in
if err != nil {
print("error saving data into firebase")
return
}
})
}, withCancel: nil)
与您的版本相比的更改:
- 这不再添加观察者,因为您的新数据不依赖于任何现有数据,所以不需要观察者。
- 现在调用
childByAutoId()
来生成新的子节点。 - 然后调用
setValue()
来设置新子节点的值。 - 该函数名为
postJobDataIntoDatabaseWithUID
,修复了原始版本中的拼写错误。
关于ios - 更新 firebase 中的数据而不覆盖以前的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58072597/