在Firebase中更新数据而不覆盖以前的数据

时间:2019-09-24 03:17:29

标签: ios swift firebase firebase-realtime-database

我正在尝试将数据保存到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上,但我可能已经走了。感谢您提供的所有帮助。

1 个答案:

答案 0 :(得分:0)

如果要将新的子节点添加到具有自动生成的ID(并保证是唯一的)ID的位置,则需要在该位置调用childByAutoId()

因此,在调用/UserSwipes/$uid时在postJobDataIntoDatabaseWithUID下添加一个新的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,用于修复原始文档中的错字。