私はこのfirebaseデータベースを持っています
ユーザーのすべての電話番号を取得する必要がありますが、すべての子を取得するにはどのリスナーを使用する必要がありますか?
すべてのユーザーは、そのオブジェクトの名前としてユーザーIDを持つオブジェクトとして追加されます。ユーザーIDを知らなくても、このオブジェクトを取得する必要があります。
DataSnapshot
に関連するドキュメントを検索しましたが、リスナーなしではDataSnapshot
を取得できませんでした。 DataSnapshoutを探すのは正しいですか、それとも他のものを使用しますか
最初にユーザーのデータスナップショットを取得します。
//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にキャストする必要がある場合があります。
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*/
これを試してみてください:
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());
}
});