如何使用childByAutoId更新Firebase中的值?

时间:2016-09-27 00:00:03

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

当我在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)

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

3 个答案:

答案 0 :(得分:6)

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

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

试试这个:

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)
  5. 当然,您需要在制作用户密钥时存储它们。您可以在设备上使用SharedPreferences,但如果它因任何原因被清除,那么该数据将只是坐在那里。您也可以将它存储在应用程序的内部存储中,但我会使用SharedPreferences。

    希望这有帮助!

答案 1 :(得分:1)

snapshot有一个属性key

  

生成此FIRDataSnapshot的位置的键。

正如您所看到的那样,您可以通过调用observeSingleEvent(of: .value, with: { (snapshot)...

来获取一个(快照)

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

尝试拨打let key = snapshot.key

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

希望有效

答案 2 :(得分:0)

我根据自己的问题(有点类似)调整了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)
                                    }
                                }
                            }
                        })