【问题标题】:How to update value in Firebase with childByAutoId?如何使用 childByAutoId 更新 Firebase 中的值?
【发布时间】:2017-02-04 11:06:24
【问题描述】:

当我在 Firebase 中创建对象时,我使用 childByAutoId。以后如何更新这些特定对象?我无法获取密钥 Firebase 自动更新的值。 Snapshot.key 只返回“用户”。这是我的 JSON 结构:

{
  "users" : {
    "-KQaU9lVcUYzIo52LgmN" : {
      "device" : "e456f740-023e-440a"
      "name: "Test"
    }
  },

如何获得-KQaU9lVcUYzIo52LgmN 密钥?我想更新设备孩子。这是我到目前为止所拥有的。它目前会创建一个完全独立的快照,其中只有一个孩子。

self.rootRef.child("users").queryOrdered(byChild: "name").queryEqual(toValue: self.currentUser).observeSingleEvent(of: .value, with: { (snapshot) in
    let key = self.rootRef.child("users").childByAutoId().key
    let childValues = ["device": device]
    self.rootRef.child("users").child(key).updateChildValues(childValues)

编辑:设备是在代码中进一步设置的字符串。未在此范围内定义(以便于阅读此问题)。

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database swift3


    【解决方案1】:

    snapshot 有一个属性key

    生成此 FIRDataSnapshot 的位置的键。

    如您所见,您可以通过调用 observeSingleEvent(of: .value, with: { (snapshot)... 获得一张(快照)

    所以而不是let key = self.rootRef.child("users").childByAutoId().key

    尝试拨打let key = snapshot.key

    childByAutoId().key 总是根据时间戳生成新的唯一键,这就是为什么你要创建新的孩子,而不是更新你想要的孩子

    希望有效

    【讨论】:

      【解决方案2】:

      当您获得 Snapshot.key 时,它会返回“用户”,因为这是您的快照的整体密钥。快照中“用户”内的所有内容都被视为值。

      您需要遍历子层以深入挖掘“设备”。

      试试这个:

      rootRef.child("users").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
          if let result = snapshot.children.allObjects as? [FIRDataSnapshot] {
              for child in result {
                  var userKey = child.key as! String
                  if(userKey == userKeyYouWantToUpdateDeviceFor){
                      rootRef.child("users").child(userKey).child("device").setValue(device)
                  }
              }
          }
      })
      

      此代码将执行以下操作:

      1. 获取参考的快照(关键是 'users')。
      2. 获取所有子项(您的用户密钥)并将它们分配为另一个 快照到'result'
      3. 每次检查一个键,直到找到您想要的键(例如 例如,如果您使用键 "-KQaU9lVcUYzIo52LgmN" 查找用户, 它会在您的示例代码的第一次迭代中找到它 已发布)。
      4. 一旦找到该键,它就会为该键中的设备设置值 用线键 rootRef.child("users").child(userKey).child("device").setValue(device)

      当然,您需要在制作时存储所有用户密钥。您也许可以为此在设备上使用 SharedPreferences,但如果它因任何原因被清除,那么该数据将就在那里。您也可以将其存储在应用的内部存储中,但我会使用 SharedPreferences。

      希望这会有所帮助!

      【讨论】:

      • 完美运行!太感谢了!!我知道有办法,但我就是想不通。循环通过snapshot.children.allObjects 看起来像是要走的路
      • 太棒了!很高兴我能帮助你。通过询问这里的人,我学到了完全相同的方法。 ;)
      【解决方案3】:

      我调整了 Ryan 对我自己的问题的回答(有点类似),并想出了一种方法来直接更新您的设备 ID,而无需知道/存储 Firebase 生成的 AutoID 密钥:

      reference = Database.database().reference().child("users")
      
      reference.observeSingleEvent(of: .value, with: { (snapshot) in
                                  if let result = snapshot.children.allObjects as? [DataSnapshot] {
                                      for child in result {
                                          if child.childSnapshot(forPath: "device").value as? String == self.yourDeviceIDVariable {
                                              print("### Device exists in Firebase at key = \(child.key)")
                                              let childKey = child.key
                                              self.reference.child(childKey).child("device").setValue(yourNewDeviceID)
                                          }
                                      }
                                  }
                              })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多