我一直在寻找答案并尝试了许多教程,但仍无法解决问题。我正在开发一个应用程序,用户可以在地图上添加标记,其他所有用户都可以看到标记。但是我无法使其工作,因为数据库中的标记永远不会显示。
这是我从数据库读取的代码:
mLocation.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
MarkerLocation markerLocation = dataSnapshot.child("location").getValue(MarkerLocation.class);
for (DataSnapshot s : dataSnapshot.getChildren()){
double latitude = (double) (s.child("lat").getValue());
double longitude = (double) ((s.child("lng").getValue()));
LatLng location = new LatLng(latitude,longitude);
mMap.addMarker(new MarkerOptions().position(location));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
和firebase数据库如下:
应用
-location
-marker
-latitude:43.849
-longitude:-109.737
有任何帮助。
答案 0 :(得分:1)
尝试一下:
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
MarkerLocation markerLocation = dataSnapshot.child("location").getValue(MarkerLocation.class);
LatLng location = new LatLng(markerLocation.latitude, markerLocation.longitude);
mMap.addMarker(new MarkerOptions().position(location));
}
}
答案 1 :(得分:0)
如果您的配置正确,则应该可以使用以下标记显示标记:
LatLng loc = new LatLng(-33.852, 151.211);
googleMap.addMarker(new MarkerOptions().position(loc)
.title("Marker"));
此外,如果您的firebase数据结构是您之前发布的,请查看以下关键:您正在使用
double latitude = (double) (s.child("lat").getValue());
double longitude = (double) ((s.child("lng").getValue()));
但是应该是:
double latitude = (double) (s.child("latitude").getValue());
double longitude = (double) ((s.child("longitude").getValue()));
答案 2 :(得分:0)
要根据您的实际架构在地图上添加数据库中所有标记,请使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference locationRef = rootRef.child("location");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
MarkerLocation markerLocation = ds.getValue(MarkerLocation.class);
LatLng latLng = new LatLng(markerLocation.getLatitude(), markerLocation.getLongitude());
mMap.addMarker(new MarkerOptions().position(latLng));
Log.d(TAG, markerLocation.getLatitude() + ", " + markerLocation.getLongitude());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
locationRef.addListenerForSingleValueEvent(valueEventListener);
如果您将值直接设置到公共字段中,请更改以下代码行:
LatLng latLng = new LatLng(markerLocation.getLatitude(), markerLocation.getLongitude());
到
LatLng latLng = new LatLng(markerLocation.latitude, markerLocation.longitude);
答案 3 :(得分:0)
由于使用的是addListenerForSingleValueEvent API,可能未获得更新,该API将对数据库节点进行一次查询。如果您想连接一个侦听器,以便在节点更改时每次接收更新,则需要使用addValueEventListener API。