まず、ユーザーの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にキャストする必要があります。
ありがとうございます。私は 'allPhoneNumbers'にキーを使用します。本当に明るいアイディアです。 – mxml
素晴らしいです。あなたが物事の書き方をより詳細にコントロールできるので、firebaseを使っている個人的なヒントは、firebase(setValue/updateChildren)に書き込むときには大変です。読んでいるときは、非同期リスナを持つノードの下のすべてを取得する必要があるため、ほとんどコントロールできません。したがって、書き込みの時点でデータを整理することで、データをより簡単に読み取ることができます。 –