2017-10-02 5 views
0

Firebaseのノードのすべての子を含むマップを返すメソッドを作成しようとしていますが、コールバックを使用する必要があるため空のマップが返されます。Firebaseノードのすべての子をMapとして返す方法

public Map<Date, String> getChildrenAsMap(String nodeId) { 
    DatabaseReference refernce= dbRoot.child("childName").child(nodeId); 
    final Map<Date, String> childMap = new HashMap<>(); 

    refernce.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      Map<Date, String> data = (Map<Date, String>) dataSnapshot.getValue(); 

      for (Map.Entry<Date, String> entry : data.entrySet()) { 
       childMap .put(entry.getKey(), (String) entry.getValue()); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.w("TAG", "onCancelled", databaseError.toException()); 
     } 
    }); 
    return childMap; 
} 

答えて

1

これは、Firebaseクエリが非同期で発生し、マップを返した後にリスナーが呼び出されるためです。それを単純にするには:ValueEventListenerが既にこれを行うインターフェイスであるため、このような非同期メソッドを作成することはできません。あなたは、このような方法は、作業したい場合、あなたはあなたのためにそれを処理するクラスを作成する必要があると思いますが、あなたは、AndroidためFirebaseが提供するあなたが望むすべて持っているので、これは必要ありません:私は

DatabaseReference refernce= dbRoot.child("childName").child(nodeId); 

deviceHistory.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Map<Date, String> childMap = new HashMap<>(); 

     Map<Date, String> data = (Map<Date, String>) dataSnapshot.getValue(); 

     for (Map.Entry<Date, String> entry : data.entrySet()) { 
      childMap.put(entry.getKey(), (String) entry.getValue()); 
     } 

     // handle your childMap modifications in here, this gets executed after the value is retrieved 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.w("TAG", "onCancelled", databaseError.toException()); 
    } 
}); 

を別の同様の注釈を書いた(スウィフトの場合でも、それは関連する点ではない)here。あなたはそれを使用するたびにValueEventListenerにあなたのロジックを書かなければなりません。それはすでに方法なので、新しいものを作成する必要はありません。

0

この問題を解決するには、onDataChange()からデータを取得する必要があります。このpostから私の答えを見てください。

これは、その反復の前に呼び出されるonDataChange()の非同期動作のために起こっています。

+0

これは機能しません。 – creativecreatorormaybenot

+0

なぜあなたはそれをどう思いますか? –

+0

あなたの 'childMap'は有効範囲外です。return文は非同期イベントを待つことはありません。 – creativecreatorormaybenot

関連する問題