2017-01-06 9 views
1

私はthis questionと答えています。この新しい質問が私の心に浮かんできます。その質問には DataSnapshotの値がnullである可能性はありますか?

は、私はこのように私のコード例について説明します。

boolean firstCallDone = false; 
boolean secondCallDone = false; 

DataSnapshot firstDataSnapshot = null; 
DataSnapshot secondDataSnapshot = null; 

onCreate() { 
    firstRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      firstCallDone = true; 
      firstDataSnapshot = dataSnapshot; 

      if (firsCallDone && secondCallDone) 
       doSomething(); 
     } 
     ... 
    } 
    secondRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      secondCallDone = true; 
      secondDataSnapshot = dataSnapshot; 

      if (firsCallDone && secondCallDone) 
       doSomething(); 
     } 
     ... 
    } 
} 

doSomething() { 
    // do something with firstDataSnapshot and secondDataSnapshot 
    ... 
} 

上記のコードの目的は、2つのFirebaseデータベースを呼び出すと、その値が得られたdoSometing()後に実行することです。

次に、このif (firsCallDone && secondCallDone)のような検証の代わりに、if (firstDataSnapshot != null && secondDataSnapshot != null)のように検証できます。これは、私が知る限り、DataSnapshot は決して null(その値はonDataChange()の内部に埋め込まれています)です。

でもわかりません。 onDataChange()の中にDataSnapshotがnullになる可能性はありますか?もし存在すれば、それが起こるケースは何ですか?

答えて

2

DataSnapshotは関係なく、(データがない場合は、空が、非ヌルDataSnapshotを取得しますので)データが存在があるかどうかの、nullになることはありません。

+0

この質問に答えるのに不思議と探している他の人には、[この回答をチェック](http://stackoverflow.com/a/41513071/4112725) – koceeng

1

いいえ、DataSnapshotの値は決してnullになりません。

エラーが発生した場合は、代わりにonCancelled()メソッドがトリガされます。

ところで、各リスナーが終了していることを確認するためのフラグを作成する代わりに、Tasks APIを利用してこれらのタスクを管理する必要があります。 This answer from a Firebaserについてこれについて説明し、そのためのクラスも提供しています。

乾杯:)

+1

Heil Wilik:DataSnapshotは値がない場合でもnullにはなりません。 'DataSnapshot.getValue()'は 'null'を返しますが、スナップショット自体は常に有効なオブジェクトになります。そのため、たとえば、 'snapshot.exists()'を呼び出して、照会している場所に値があるかどうかを調べることができます。 –

+0

@FrankvanPuffelenの修正をありがとうございます。私が「DataSnapshot'の値として参照しているのは、実際には 'DataSnapshot.getValue()'ですが、質問を再読み込みした後の質問者の意図ではないことに気づきました。私は私の答えを編集します。 :) – Wilik

+0

うん。私は、getValue()に基づいた答えを提供するために私の道を歩んでいました。質問がスナップショットオブジェクトそのものに関するものであると分かったとき。それゆえ、私はマイケルを引き上げて、さらに権威ある答えを得ました。 :-) –

関連する問題