2017-01-25 1 views
0

これは私のダミーfirebase構造体です。Firebase Android - uniqueIDに基づいて同じオブジェクトの2つのノードからデータを取得

{ "Restaurant":{ 
    pushId: { 
      "Node A":{ 
        0:{ id = 1234 
         // data of some object type 
         } 
        1:{ id = 2345 
         // data of some object type 
         } 
        2:{ id = 3456 
         // data of some object type 
         } 
       } 
      "Node B":{ 
        0:{ id = 6789 
         // data of some object type 
         } 
        1:{ id = 9876 
         // data of some object type 
         } 
        2:{ id = 0000 
         // data of some object type 
         } 
       } 
     } 

    } 
} 

私はいくつかのユニークなID(仮定するID = 1234 & 0000)と、同時に "ノードA" と "ノードB" からデータを抽出したいです。 「ノードA」および「ノードB」は、同じ種類のオブジェクトを含む。私は持っているすべての情報を試しましたが、それを働かせることができました。

私は書いたコードを付けています。以下のコードは実際のデータです。

ref.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot dataSnapshotChildren : dataSnapshot.getChildren()) { 
       final DatabaseReference reference = dataSnapshotChildren.child(pref.getString("user_uid", null)).getRef(); 
       for (int j = 0; j < stringArray.length; j++) { 
        Log.d("res_details activity", "stringArray: " + stringArray[j]); 
        reference.orderByChild("id").equalTo(stringArray[j]).addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          Log.d("res_details activity", "dataSnapshot: " + dataSnapshot.getValue()); 
          for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) { 
           Restaurant restaurant = singleSnapshot.getValue(Restaurant.class); 
           Log.d("res_details activity", "restaurant: " + restaurant); 
           restaurantArrayList.add(restaurant); 
          } 
          Log.d("res_details activity", "restaurantArrayList: " + restaurantArrayList.size()); 
          setValue(restaurantArrayList); 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

          Log.d("res_details activity", "databaseError: " + databaseError); 

         } 
        }); 

       } 
      } 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

すべてのデータベース参照は正しいです。私はログステートメントでチェックした。上記のコードでは、一度に1つの結果しか得られません。私はこのコードを変更するのを手伝ってください。前もって感謝します。どんな提案も感謝しています。

P.S - 実際のfirebase構造のスクリーンショットを添付できませんでした。

更新 新しいスニペット:

ref.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      Log.d("res_details activity", "s: " + s); 
      for (DataSnapshot dataSnapshotChildren : dataSnapshot.getChildren()) { 

       for (int j = 0; j < stringArray.length; j++) { 
        Log.d("res_details activity", "reference: " + dataSnapshotChildren.getRef().toString()); 
        Log.d("res_details activity", "stringArray: " + stringArray[j]); 
        databaseReference.orderByChild("id").equalTo(stringArray[j]).addChildEventListener(new ChildEventListener() { 
         @Override 
         public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
          Log.d("res_details activity", "dataSnapshot: " + dataSnapshot.getValue()); 
          for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) { 
           Restaurant restaurant = singleSnapshot.getValue(Restaurant.class); 
           Log.d("res_details activity", "restaurant: " + restaurant); 
           restaurantArrayList.add(restaurant); 
          } 
          Log.d("res_details activity", "restaurantArrayList: " + restaurantArrayList.size()); 
          setValue(restaurantArrayList); 
         } 


         @Override 
         public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

         } 
.... 

私もchildEventListenerを試してみました。今ではそれも入れないchildEventListenerをトリガします。そして、私は今何の結果も得ていない。すべての参照が正しい。クエリが正しいです。なぜスニペットがデータを取得していないのか分かりません。今は完全に混乱する。

+0

この場合、ValueEventListenerは使用するのに適切ではありません。 ValueEventListener.onDataChange()は、特定のデータベース参照に対して常に1回、最後に呼び出されます。 ChildEventListenerを使用してデータを取得する方がよいでしょう。 http://stackoverflow.com/questions/34530566/find-out-if-child-event-listener-on-firebase-completely-load-all-data –

+0

@Taras私は 'childEventListener'でも試しました。しかし、それは動作しません。コードの何が間違っていますか? –

答えて

0

スナップショットにはHashMapオブジェクトが含まれています。ノードAとノードBは、対応する値(Object)を持つキーとして表現されます。あなたのようなデータ構造の例を見てみましょう。

ref.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()){ 
        HashMap<String, Long> m = (HashMap<String, Long>) snapshot.getValue(); 
        Log.d("test", String.valueOf(m.get("id"))); 
       } 
      } 

フィルタ条件を設定してください。お気軽にお越しください!

+0

私のfirebaseデータには、カスタムクラスオブジェクト "Restaurant"が含まれています。いくつかの変数があり、 "id"はレストランタイプのオブジェクトを一意に識別します。私の理解によると、あなたはハッシュマップからIDの値を取得しています。しかし、それは私の必要条件ではありません。私がIDのカップルを持っていて、そのIDを使ってfirebaseからデータを取得したいとします。主な問題は、これらのIDがどのノードにも存在する可能性があることです。例えば:(スナップショットから)私が3つのIDを持っている場合 - '1234'、' 6789'、 '0000'。今私はそれらのIDを持つ対応するノードのデータを取得したい。あなたがもっと情報を必要とするかどうか私に教えてください。 –

関連する問題