먼저 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 (setValue/updateChildren)에 쓸 때 모든 일들을 처리하는 데있어 모든 일들을 처리합니다. 읽는 동안 비동기 리스너가있는 노드 아래 모든 것을 가져와야하기 때문에 통제력이 거의 없습니다. 따라서 작성 시점에서 데이터를 구성함으로써 데이터를 훨씬 쉽게 읽을 수 있습니다. –