2016-08-16 24 views
19

私はこのfirebaseデータベースfirebaseデータベースのすべての子供のデータを取得するには?

enter image description here

持っていると私はすべてのCHILDESを取得するために使用しなければならないリスナーのユーザーのすべての電話番号を取得する必要がありますか?

すべてのユーザーがそのオブジェクトの名前などのユーザーIDを持つオブジェクトとして追加されたが、私は、それはDataSnapshotに関連していますこれは私がドキュメントを検索すること、ユーザーID

を知らなくてもオブジェクトを取得する必要があるが、私はcouldnリスナーなしでDataSnapshotを取得してください! DataSnapshoutを探すのは正しいのですか?何か他のものを使用しますか?

答えて

26

まず、ユーザーのdatasnapshotを取得します。

//Get datasnapshot at your "users" root node 
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users"); 
    ref.addListenerForSingleValueEvent(
      new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        //Get map of users in datasnapshot 
        collectPhoneNumbers((Map<String,Object>) dataSnapshot.getValue()); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        //handle databaseError 
       } 
      }); 

ユーザーをループし、地図にアクセスして電話のフィールドを収集します。

private void collectPhoneNumbers(Map<String,Object> users) { 

    ArrayList<Long> phoneNumbers = new ArrayList<>(); 

    //iterate through each user, ignoring their UID 
    for (Map.Entry<String, Object> entry : users.entrySet()){ 

     //Get user map 
     Map singleUser = (Map) entry.getValue(); 
     //Get phone field and append to list 
     phoneNumbers.add((Long) singleUser.get("phone")); 
    } 

    System.out.println(phoneNumbers.toString()); 
} 

このリスナーは、明示的に呼び出されたときにのみdatasnapshotを取得します。ユーザノードに加えて、「allPhoneNumbers」ノードの下に数字のリストを格納することを検討してください。これにより、すべての番号を収集する際に、データスナップショットを軽量で簡単に処理できます。何百人ものユーザーがいるとすれば、「ユーザー」のデータスナップショットは非常に大きくなり、「allPhoneNumbers」リストがはるかに効率的になります。

上記のコードは、サンプルデータベースでテストされ、動作します。ただし、ユーザーの電話インスタンスフィールドのタイプに応じて、電話フィールドをStringまたはintにキャストする必要があります。

+0

ありがとうございます。私は 'allPhoneNumbers'にキーを使用します。本当に明るいアイディアです。 – mxml

+0

素晴らしいです。あなたが物事の書き方をより詳細にコントロールできるので、firebaseを使っている個人的なヒントは、firebase(setValue/updateChildren)に書き込むときには大変です。読んでいるときは、非同期リスナを持つノードの下のすべてを取得する必要があるため、ほとんどコントロールできません。したがって、書き込みの時点でデータを整理することで、データをより簡単に読み取ることができます。 –

7
 DatabaseReference ref1= FirebaseDatabase.getInstance().getReference(); 
     DatabaseReference ref2,ref3,ref4;  
     ref2 = ref1.child("User"); 


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

      Userlist = new ArrayList<String>();     
      // Result will be holded Here 
      for (DataSnapshot dsp : dataSnapshot.getChildren()) { 
        Userlist.add(String.valueOf(dsp.geValue())); //add result into array list 

       } 
    /* userlist will store all values of users, then point to every userlist item 
    and get mobile numbers*/ 
+0

ありがとうございました – mxml

関連する問題