[英]iOS Firebase -How to create multi node location update using .childByAutoId()
[英]How to update value in Firebase with childByAutoId?
当我在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)
编辑:设备是代码中进一步设置的字符串。 未在此范围内定义(以便更容易阅读此问题)。
当您获得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)
}
}
}
})
此代码将执行以下操作:
'users'
)。 'result'
。 "-KQaU9lVcUYzIo52LgmN"
,它将在您发布的示例代码的第一次迭代中找到它)。 rootRef.child("users").child(userKey).child("device").setValue(device)
行rootRef.child("users").child(userKey).child("device").setValue(device)
该密钥内的设备的值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
总是根据时间戳生成新的唯一键,这就是你创建新子的原因,而不是更新你想要的那个
希望有效
我根据自己的问题(有点类似)调整了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)
}
}
}
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.