根据子Firebase Android的值更改位置时更新标记
我需要Firebase数据库的帮助 我想做的是在我的地图上显示所有来自可用工作人员的用户(例如,N2GCEIGYBaRiNrFPawklx1NymF3,运行5pazc0wnzym6yjrrtbqvxooh2) 这是Firebase数据库的屏幕截图 以下是我当前的代码:根据子Firebase Android的值更改位置时更新标记,android,google-maps,firebase,firebase-realtime-database,Android,Google Maps,Firebase,Firebase Realtime Database,我需要Firebase数据库的帮助 我想做的是在我的地图上显示所有来自可用工作人员的用户(例如,N2GCEIGYBaRiNrFPawklx1NymF3,运行5pazc0wnzym6yjrrtbqvxooh2) 这是Firebase数据库的屏幕截图 以下是我当前的代码: private void loadAllAvailableWorkers(final LatLng location) { //Delete markers on the map including client lo
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) {
}
});
}
这是我需要(再次)获取当前子用户ID的父级的部分
要解决此问题,请使用以下代码:
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);
输出将是所有可用工件的名称。您想显示这些ID:
N2GCEIGYBaRiNrFPawklx1NymF3
和ruN5PaZC0WNZYm6YJrRtbQVXOoH2
?很好,您仍然在运行!是的,我想让他们显示在地图上,但在获取子孩子(如管道工等)时,我似乎遇到了麻烦。您想查询哪些ID或名称?把那张照片换成更详细的。嗨,亚历克斯!请查看有关该问题的更新。我尝试了你所做的,但我似乎无法在我的地图上显示标记。请用另一张更详细的图片更改图片。展开N2GCEIGYBaRiNrFPawklx1NymF3
和运行5pazc0wnzym6yjrrtbqvxooh2
节点,以清楚地看到这些节点。你不能用它来实现这一点g
和l
不同,必须具有相同的结构。
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);