2016-09-27 46 views
1

當我在Firebase中創建對象時,我使用childByAutoId。我以後如何更新這些特定的對象?我無法獲取關鍵Firebase自動更新的價值。 Snapshot.key只是返回「用戶」。這是我的JSON結構:如何使用childByAutoId更新Firebase中的值?

{ 
    "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) 

編輯:device是進一步在代碼中設置的字符串。未在此範圍內定義(以便於閱讀此問題)。

回答

4

當您獲取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) 
      } 
     } 
    } 
}) 

此代碼將執行以下操作:

  1. 獲取參考的快照(用於關鍵是 'users')。
  2. 獲取所有孩子(您的用戶密鑰)並將它們作爲另一個 快照分配給'result'
  3. 檢查的,直到找到你想要的關鍵時刻每個鍵(用於 例如,如果您尋找用戶與關鍵"-KQaU9lVcUYzIo52LgmN", 它會發現它在你的示例代碼的第一次迭代你 發佈)。
  4. 一旦找到該密鑰,它就會在 密鑰內爲該設備設置值 rootRef.child("users").child(userKey).child("device").setValue(device)

當然,您需要在製作時存儲所有的用戶密鑰。你可以在設備上使用SharedPreferences來做這件事,但是如果它因任何原因被清除了,那麼這些數據就會坐在那裏。您也可以將它存儲在您的應用程序的內部存儲中,但SharedPreferences是我會使用的。

希望這會有所幫助!

+0

完美地工作!非常感謝!!我知道有一種方法,但我無法弄清楚。循環瀏覽'snapshot.children.allObjects'看起來像要走的路 – winston

+0

非常好!很高興我能幫上忙。我通過詢問人們在這裏學到了完全相同的方式。 ;) – Ryan

1

snapshot有一個屬性key

生成此FIRDataSnapshot位置的鍵。

而且你可以看到你得到一個(快照)通過調用observeSingleEvent(of: .value, with: { (snapshot)...

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

嘗試調用let key = snapshot.key

childByAutoId().key基於時間戳總是產生新的唯一關鍵,這就是爲什麼你正在創造新的孩子,而不是更新你想要的那個

Hope th在作品

0

我適應Ryan的回答我自己的問題(有點類似),並想出一個辦法來更新您的設備ID的情況下直接需要知道/店由火力地堡產生的自動識別鍵:

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) 
            } 
           } 
          } 
         })