![](/img/trans.png)
[英]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.