2017-11-12 4 views
3

まず、私はこの質問が複数回尋ねられてきたことを知っていますが、最近の問題は私のアプリでこの問題に関心を寄せています。 Firebaseのドキュメントも読んでいます。上記のトピックからFirebaseの子と値のリスナー

What is the difference between ChildEventListener and ValueEventListener Firebase interfaces?

、両方の子供とイベントリスナーは、同じ機能を持っていますが、私は本当だと思う別の「柔軟性」、と思われます。

私は最近のプロジェクトから2つの例を説明します。

例1:

データベース構造

{ 
    "requests" : { 
    "pushed_id_1" : { 
     "request_name" : "qjvnocnqjd", 
     "request_date" : "11 Oct 2017" 
    }, 
    "pushed_id_2" : { 
     "request_name" : "qjvnocnqjd", 
     "request_date" : "10 Nov 2017" 
    } 
    } 
} 

上記構造を参照すると、私の初期計画はFirebaseにおけるクエリ方法を使用して、最後のノードの値を得ることでした。ここにコードのスニペットがあります。

myRef.child("requests").orderByKey().limitToLast(1).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Request request = dataSnapshot.getValue(Request.class); 
       Log.d(TAG, "requestDate: " + request.getRequest_date()); 
      } 

上記のコードでは、request.getRequest_date()のnull値が返されました。その後、解決策を探すのに苦労して、私は以下の記事を見つけました。

Retrieve null values from Firebase database Android

TL;上記のリンクのDRは、ソリューションではなくChildListenerにValueEventListenerを変更することであり、それは私のプロジェクトに驚異を働いていたということです。次に、私の2番目の例が来る。

例2:

データベース構造ここで

{ 
    "users" : { 
    "user_uid_1" : { 
     "user_name" : "Admin", 
     "join_date" : "7 Nov 2017" 
    }, 
    "user_uid_2" : { 
     "user_name" : "Member", 
     "join_date" : "9 Nov 2017" 
    } 
    } 
} 

は、ユーザデータを取得するために私のコードの抜粋です。

myRef.child("users").child(userID).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       User user = dataSnapshot.getValue(User.class); 
       Log.d(TAG, "userDeets: " + user.getJoin_date()); 

       } 
      } 

上記コードは、user.getJoin_date()の場合はnullを返しません。それから、私は突然、説明を求めて、前進して、これらの2人のリスナーがどのように働いて、それに応じて選ぶかを理解することができます。クエリが関与している場合は、ChildEventListenerは私が代替するのではなく、選択したものです

  • :?

    これらは私の具体的な質問ですか

  • 上記の2つの例から、指定されたノードの1つ下にすぐにKey:Valueのペアを持つノードを指定できる場合、ValueEventListenerが使用されているようです。一方、ChildEventListenerは、Valueが関与していない場合にのみ使用されます(ChildEventListenerの「Child」は何ですか?)。この前の声明を言ってもいいですか?

この部分までお読みいただきありがとうございます。この質問が長すぎる場合はお詫び申し上げます。

答えて

1

これらは私の具体的な質問です:

クエリが関与している場合は、ChildEventListenerは私が代替するのではなく、選択したものですか?

上記の2つの例から、指定したノードのすぐ下にKey:Valueのペアを持つノードを指定できる場合、ValueEventListenerが使用されているようです。一方、ChildEventListenerは、Valueが関与していない場合にのみ使用されます(ChildEventListenerの「Child」は何ですか?)。この前の声明を言ってもいいですか?

valueeventlistenerとchildeventlistenerはどちらも同じですが、データを一度だけ読み取るaddListenerForSingleValueEventとは異なります。

ここでは、クエリが関係する場合はどちらも選択できません。いつもchildeventListenerを使用する必要はありません。だから、データがdataSnapshotの子どもたちの内部で反復します

for(DataSnapshot data : dataSnapshot.getChildren()){ 

:通常、我々はループのために使用valueeventlistenerであなたが言ったことを2番目の質問そのちょっと真については、

。しかし、ChildEventListenerを使用する場合、上記のforループを使用する必要はありません。

しかし、明らかにそれがネストされている場合はより多くのあなたはそれがはるかに簡単だchildeventlistener

+0

迅速な対応をありがとうございます。あなたの答えとフランクの両方に基づいて、両方のリスナーがあなたの説明に従って私の例の両方のために働くことができるようです。お返事ありがとうございました! – applejuice

+0

問題ありません! @applejuiceハッピーコーディング! –

2

でそのループを行う必要があります:ValueEventListener火災を一度全体結果と、結果のそれぞれの子ノードを持つChildEventListener火災を個別に送信します。あなたがValueEventListenerChildEventListenerが必要な場合は、考慮すべき二つのものがあるかを決定するために

  1. 単一の項目をご参照点かどうか、またはそれは、リストの場合。
  2. (リストの場合)個々のアイテムを個別に処理するかどうか、またはすべてを一度に処理するかどうか。

単一の項目を指すリスナーがある場合は、ValueEventListenerを使用します。

リストを指すリスナーまたはクエリがある場合、子/結果が1つだけでも、そのリストを処理する必要があります。 ChildEventListenerを使用するか、またはDataSnapshot.getChildren()をループしてValueEventListener.onDataChange()にすることで、これを行うことができます。

+0

関連のない質問ですが、2つのリスナー間にメモリとネットワークの使用に違いがありますか? (これは、ChildEventListenerがコードの2倍の長さであるという事実以外のものです) – applejuice

関連する問題