web-dev-qa-db-ja.com

firebaseデータベースですべての子供のデータを取得する方法は?

私はこのfirebaseデータベースを持っています

enter image description here

ユーザーのすべての電話番号を取得する必要がありますが、すべての子を取得するにはどのリスナーを使用する必要がありますか?

すべてのユーザーは、そのオブジェクトの名前としてユーザーIDを持つオブジェクトとして追加されます。ユーザーIDを知らなくても、このオブジェクトを取得する必要があります。

DataSnapshotに関連するドキュメントを検索しましたが、リスナーなしではDataSnapshotを取得できませんでした。 DataSnapshoutを探すのは正しいですか、それとも他のものを使用しますか

32
mxml

最初にユーザーのデータスナップショットを取得します。

//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());
}

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

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

41
TempDev
      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*/
12
Narender Reddy

これを試してみてください:

Firebase ref = new Firebase(FIREBASE_URL);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
  Log.e("Count " ,""+snapshot.getChildrenCount());
  for (DataSnapshot postSnapshot: snapshot.getChildren()) {
    <YourClass> post = postSnapshot.getValue(<YourClass>.class);
    Log.e("Get Data", post.<YourMethod>());
  }
}
@Override
public void onCancelled(FirebaseError firebaseError) {
  Log.e("The read failed: " ,firebaseError.getMessage());
}
});
1
Gaurang Kanani