2017-03-26 14 views
2

usernameを受け取る必要があります。fullNameは「Bobby」と同じです。だから私は、次の構文を使用してFirebaseデータベースからデータを取得しようとしている:FirebaseのDataSnapshotの値を正しく解析する方法

ref.orderByChild("fullName").equalTo("Bobby").addListenerForSingleValueEvent(new ValueEventListener() {...} 

私はdataSnapshot.getValue()から取得することはこれです:

{id3={username=bob, score=150, fullName=Bobby}} 

私が最善か、正しい方法が何であるかを知っていただきたいと思いますどのidが返されたのかわからない場合はusernameを取得しますか?

は現在、私はそれをこのように実現しています:

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference ref = database.getReference("Scores"); 

    ref.orderByChild("fullName").equalTo("Bobby").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.i(TAG, "dataSnapshot value = "+dataSnapshot.getValue()); 
      if(dataSnapshot.hasChildren()){ 
       Iterator<DataSnapshot> iter = dataSnapshot.getChildren().iterator(); 
       DataSnapshot snap = iter.next(); 
       if(snap.hasChildren() && snap.getValue() instanceof HashMap) { 
        HashMap map = (HashMap) snap.getValue(); 
        if(map.containsKey("username")) { 
         Log.i(TAG, "onDataChange: username = " + map.get("username")); 
        } 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

EDIT: データベースの構造は次のように探しています:事前に

 { 
     "Scores" : { 
     "id1" : { 
      "fullName" : "Robert", 
      "score" : 96, 
      "username" : "rob" 
     }, 
     "id2" : { 
      "fullName" : "Michael", 
      "score" : 87, 
      "username" : "mike" 
     }, 
     "id3" : { 
      "fullName" : "Bobby", 
      "score" : 150, 
      "username" : "bob" 
     } 
     } 
    } 

感謝を。

概要:wilkas'答えを使用して

私は希望の結果を得るために、次のコードスニペットに来た:

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference ref = database.getReference("Scores"); 

    ref.orderByChild("fullName").equalTo("Bobby").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.i(TAG, "dataSnapshot value = "+dataSnapshot.getValue()); 
      if(dataSnapshot.hasChildren()){ 
       Iterator<DataSnapshot> iter = dataSnapshot.getChildren().iterator(); 
       while (iter.hasNext()){ 
        DataSnapshot snap = iter.next(); 
        String nodId = snap.getKey(); 
        String username = (String) snap.child("username").getValue(); 

        //received results 
        Log.i(TAG, username + " on nod " + nodId); 
       } 

      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

いくつかのエントリが'Bobby'に等しいfullNameを持っている場合にはうまく機能。

+1

json構造全体を投稿します –

+0

JSONの代表的なスニペットを(スクリーンショットではなくテキストとして)投稿してください。 [Firebaseデータベースコンソール](https://console.firebase.google.com/project/_/database/data/)の[Export JSON]リンクをクリックすると、簡単にこれを取得できます。JSONをテキストとして検索可能にすることで、実際のデータを使ってテストしたり、答えに使用したりすることができます。一般的には、これは良いことです。 –

答えて

1

Scoresの下にリスナーを追加するため、お子様はid1,id2およびid3となります。クエリ.orderByChild("fullName").equalTo("Bobby")を追加すると、サブファイルでフィルタリングし、1つの結果id3を取得します。したがって、最初のdatasnapshotは1人の子供id3を指します(しかし、同じ名前の "Bobby"を持つ場合は、より多くの子供がいる可能性があります)。

ユーザ名を取得するには、受け取った子を(正確に)反復する必要があります。この場合、1人の子のみが反復され、その子の子はusernameになります。

idXにはすべて、これらの子が含まれていることがわかっているので、usernamescorefullNameです。

String recordId = snap.getKey(); 

をあなたも得ることができる内部反復の中で次のように

String username = (String) snap.child("username").getValue(); 
String fullName = (String) snap.child("fullName").getValue(); 
long score = (long) snap.child("score").getValue(); 

は、さらにあなたもidを取得できます。次のようにあなたが簡単にusernameを抽出することができます(あなたのケースでsnapは子供id3への参照です) usernameを次のように表します。

String recordId = snap.getKey(); 
String username = (String) dataSnapshot.child(recordId).child("username").getValue(); 
関連する問題