2016-09-27 20 views
1

Firebaseでオブジェクトを作成すると、私はchildByAutoIdを使用します。これらの特定のオブジェクトを後でどのように更新できますか? Firebaseが自動的に更新するキーの値を取得するのに問題があります。 Snapshot.keyは "users"を返します。firebaseの値をchildByAutoIdで更新するには?

{ 
    "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. チェックし、それはあなたがしたいキーを見つけるまでの時間で各キー1は、(あなたがキー"-KQaU9lVcUYzIo52LgmN"でユーザーを探している場合 例えば、 は、それはあなた 投稿あなたのコード例では最初の反復でそれを見つけるでしょう)。
  4. それがキーを見つけたら、それはライン rootRef.child("users").child(userKey).child("device").setValue(device)とその キー内部デバイス用の値を設定します。

もちろん、すべてのユーザーキーを保存する必要があります。このためにデバイス上でSharedPreferencesを使用することもできますが、何らかの理由でクリアされた場合は、そのデータがそこに置かれます。あなたはまた、あなたのアプリの内部ストレージにそれを格納することができますが、SharedPreferencesは私が使用するものです。

希望すると便利です。

+0

は完全に働きました!どうもありがとうございます!!私は方法があることを知っていたが、私はそれを理解できなかった。 'snapshot.children.allObjects'によるループは、行く方法のように見えます – winston

+0

優秀!お役に立てて嬉しいです。私はここに人々に尋ねることで、まったく同じ方法を学びました。 ;) – Ryan

1

snapshot

このFIRDataSnapshotを生成した位置のキーである性質keyを有しています。

そして、あなたはあなたがobserveSingleEvent(of: .value, with: { (snapshot)...

を呼び出すことにより、1(スナップショット)を取得しているので、代わりのlet key = snapshot.key

childByAutoId().keyを呼び出すためのlet key = self.rootRef.child("users").childByAutoId().key

試みは常にタイムスタンプに基づいて、新たな固有のキーを生成し、見ることができますようにあなたが望むものを更新するのではなく、新しい子供を作る理由です。

希望するat works

0

私は私自身の問題(ちょっと似ている)にライアンの答えを適応とFirebaseによって生成AUTOIDキー保存/知る必要なしに直接お使いのデバイス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) 
            } 
           } 
          } 
         }) 
関連する問題