问题
I need help with Firebase database.
What I'm trying to do is to display all users from AvailableWorkers (e.g, N2GCEIGYBaRiNrFPawklx1NymF3, ruN5PaZC0WNZYm6YJrRtbQVXOoH2) on my maps.
Here's a screenshot of the Firebase Database
Here's my current code:
private void loadAllAvailableWorkers(final LatLng location) {
//Delete markers on the map including client location and available workers
mMap.clear();
//After delete, add location back
mMap.addMarker(new MarkerOptions()
.position(location)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_client_marker))
);
//Load all available Workers
DatabaseReference dbWorkerLocation = FirebaseDatabase.getInstance().getReference(Common.available_workers_table);
GeoFire gfWorkerLocation = new GeoFire(dbWorkerLocation);
GeoQuery gqWorkerLocation = gfWorkerLocation.queryAtLocation(new GeoLocation(location.latitude, location.longitude), distance);
gqWorkerLocation.removeAllListeners();
gqWorkerLocation.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, final GeoLocation location) {
FirebaseDatabase.getInstance().getReference(Common.user_workers_table)
.child(key)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Add plumber to the map
mMap.addMarker(new MarkerOptions()
.position(new LatLng(location.latitude, location.longitude))
.flat(true)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_worker_marker))
);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onKeyExited(String key) {
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
//Distance will search within 3km
if(distance <= LIMIT) {
distance++;
loadAllAvailableWorkers(location);
}
}
@Override
public void onGeoQueryError(DatabaseError error) {
}
});
}
Any help would be greatly appreciated. Thank you in advance! :)
EDITED
DatabaseReference dbWorkerLocation = FirebaseDatabase.getInstance().getReference(Common.available_workers_table);
This is the part where I need to get (again) the parent of the child current user ID
回答1:
To solve this, please use the following code:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference availableWorkersRef = rootRef.child("AvailableWorkers");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
for(DataSnapshot ds : dSnapshot.getChildren()) {
String name = ds.child("name").getValue(String.class);
Log.d("TAG", name);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
availableWorkersRef.addListenerForSingleValueEvent(valueEventListener);
The output will be the names of all available workes.
来源:https://stackoverflow.com/questions/49306983/update-marker-when-location-change-based-on-value-of-child-firebase-android