簡體   English   中英

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

[英]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)
            }
        }
    }
})

此代碼將執行以下操作:

  1. 獲取引用的快照(關鍵是'users' )。
  2. 獲取所有子項(您的用戶鍵)並將它們作為另一個快照分配給'result'
  3. 每次檢查每個密鑰,直到找到所需的密鑰(例如,如果您查找具有密鑰"-KQaU9lVcUYzIo52LgmN" ,它將在您發布的示例代碼的第一次迭代中找到它)。
  4. 一旦找到該密鑰,它就會使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM