2017-03-19 18 views
2

私は存在するrefがあり、私はobserveEventTypeを使ってデータを問い合わせます。しかし、ユーザーが削除したため、refにデータがない可能性があります。私はsnapshot.exists()を使ってテストします。以下の状況では、snapshot.exists()false/noを返します。偽であるため、何か他のことをしたいがコードは決して実行されないsnapshot.exists()がfalseを返す場合の対処方法

snapshot.exists()がfalse/noを返すときはどうすればよいですか?

 //there is no data at levelTwo so there's nothing to observe 
let levelTwoRef = dbRef.child("players").child("uid").child("levelTwo") 

levelTwoRef.observeEventType(.ChildAdded, withBlock: { 
     (snapshot) in 
     if snapshot.exists(){ 
      if let dict = snapshot.value as? [String:AnyObject]{ 
       let power = dict["power"] as? String 
       let score = dict["score"] as? String 
      } 
     //this will never run because the data has been deleted 
     } else{ 
      do something else as an alternative //why isn't this running?? 
     } 
    }) 

enter image description here

+0

更新あなたの質問(実際、テキストとしてではないIMAGE!)。 – Dravidian

+0

これはあなたのJSON構造体ではありません。FirebaseデータベースコンソールでEXPORT JSONをクリックしてJSON構造体を取得し、最も関連性の高い部分に最小化して投稿します。 – Dravidian

+0

@Dravidianあなたは何か新しいことを教えてくれました。私はそれについて知らなかった。私はそれを少しでもやっていきます。ありがとう! –

答えて

0

Firebaseは、あなたはそれが存在するかどうかを確認するためにchild上で実行することができます.hasChild機能を持っています。

子が存在するかどうかを確認する方法は、まずあなたの探している子供の前に子供のパスを設定することです。子供が探すために質問から状況で"levelTwo"であり、その前に子供がuidです:あなたはは間違いなく代わりにlevelTwoのuidを参照のための一定の設定が存在UID REFを知っていると仮定すると、

//there is no data at levelTwo so there's nothing to observe 
let levelTwoRef = dbRef.child("players").child("uid").child("levelTwo") 

REF

// uid path definitely exists 
let uidRef = dbRef.child("players").child("uid") 

levelTwo rのかどうかを確認するためにuidを参照にし、コールバックチェックの内部ファイル名を指定して実行.value EFが存在します。データベースJSON構造を持つ

uidRef?.observeSingleEvent(of: .value, with: { 
       (snapshot) in 

       if snapshot.hasChild("levelTwo"){ 
        // true -levelTwo ref Does exist so do something 
       }else{ 
        // false -levelTwo ref DOESN'T exist so do something else 
       } 
} 
0

あなたは、作成されたそれぞれの新しいパスのスナップショットを返すタイプ.ChildAdded、とその内部observeEventTypeを実行しています。一度値を取得する必要がある場合は、observeSingleEventOfTypelink)を使用し、.Valueをイベントタイプとして使用する必要があります。それはString引数としてchildを取り、それが存在するかどうか天気を依存TrueまたはFalseを返し

func hasChild(_ childPathString: String) -> Bool 

+0

ありがとうございます。 2つのもの。私はobserveSingleEventOfTypeを試しました。そこには何もなかったので、私のelse文は実行されませんでした。 2 - ノードの下に複数のパスが存在します。 .Valueはノードからすべてのすべてのスナップショットを一度に取得します。 .ChildAddedは、ノードの下のすべてを取得するために複数のトリップを行います。いずれの場合も同じ結果が得られます。それは私の問題ではない。私の問題は何もないときに何をすべきか。 –

関連する問題