如何使用childByAutoId更新Firebase中的值?
当我在Firebase中创build对象时,我使用childByAutoId。 我以后如何更新这些特定的对象? 我无法获取关键Firebase自动更新的价值。 Snapshot.key只是返回“用户”。 这是我的JSON结构:
{ "users" : { "-KQaU9lVcUYzIo52LgmN" : { "device" : "e456f740-023e-440a" "name: "Test" } },
我怎样才能得到-KQaU9lVcUYzIo52LgmN
键? 我想更新设备的孩子。 这是我迄今为止。 它目前创build一个完全独立的快照与一个孩子。
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)
编辑:设备是在代码中进一步设置的string。 未在此范围内定义(以便于阅读此问题)。
当您获得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) } } } })
此代码将执行以下操作:
- 获取你的参考快照(关键是
'users'
)。 - 获取所有的孩子(您的用户密钥),并将其作为另一个快照分配给
'result'
。 - 每次检查一个键,直到find你想要的键(例如,如果你用
"-KQaU9lVcUYzIo52LgmN"
键查找用户,它会在你发布的示例代码的第一次迭代中find它)。 - 一旦find该键,它就会使用
rootRef.child("users").child(userKey).child("device").setValue(device)
设置该键内的设备值。
当然,您需要在制作时存储所有的用户密钥。 你也可以在设备上使用SharedPreferences,但是如果因为某种原因被清除了,那么这些数据就会被放在那里。 您也可以将其存储在您的应用程序的内部存储中,但SharedPreferences是我将使用的。
希望这可以帮助!
snapshot
有一个属性key
是
产生这个FIRDataSnapshot的位置的关键。
正如你所看到的,通过调用observeSingleEvent(of: .value, with: { (snapshot)...
)来获得一个(快照) observeSingleEvent(of: .value, with: { (snapshot)...
所以而不是let key = self.rootRef.child("users").childByAutoId().key
尝试调用let key = snapshot.key
childByAutoId().key
总是根据时间戳生成新的唯一键,这就是为什么你要创build新的孩子,而不是更新你想要的
希望工程