当我开始这个活动我的应用程序停止。我需要从数据库获取坐标并放置标记。我不知道问题出在哪里。
我的数据库:
public class MapsActivityUser extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
DatabaseReference f_database = FirebaseDatabase.getInstance().getReference();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps_user);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
f_database.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
Map data = (Map) child.getValue();
Map mCoordinate = (HashMap)data.get("Blog");
double latitude = (double) (mCoordinate.get("lat"));
double longitude = (double) (mCoordinate.get("lng"));
LatLng location = new LatLng(latitude,longitude);
googleMap.addMarker(new MarkerOptions().position(location).title("pedik"));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
尝试这样来反转lat和lng
f_database.child("Blog").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
double latitude = (double) (snapshot.child("lat").getValue());
double longitude = (double) ((snapshot.child("lng").getValue());
LatLng location = new LatLng(latitude,longitude);
googleMap.addMarker(new MarkerOptions().position(location).title("pedik"));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
首先,如果你想获取所有博客的孩子,那么你应该把你的参考文献放在DatabaseReference f_database = FirebaseDatabase.getInstance().getReference("Blog");
上
当你把你的firebase引用放在DatabaseReference f_database = FirebaseDatabase.getInstance().getReference()
上时。这将获取数据库的所有节点,例如博客和用户。如果您需要博客信息,则无需获取用户数据。对于firebase来说,这是一个非常糟糕的代码实践。
其次,正如@Benjith binja建议您可以获取所有Blog的孩子来获取纬度和经度。或者,您应该创建一个Blog对象并获取数据。这是一个很好的做法。 https://firebase.google.com/docs/database/android/read-and-write
博客对象:
class Blog {
public String desc,id,image,time,title,uid,username;
public Double lat,lng;
public Blog(String desc, String id, String image, String time, String title, String uid, String username, Double lat, Double lng) {
this.desc = desc;
this.id = id;
this.image = image;
this.time = time;
this.title = title;
this.uid = uid;
this.username = username;
this.lat = lat;
this.lng = lng;
}
}
firebase监听器看起来像这样:
DatabaseReference f_database = FirebaseDatabase.getInstance().getReference("Blog");
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
for(DataSnapshot snapshot:dataSnapshot.getChildren()){
// Get Blog object and use the values to update the UI
Blog blog = snapshot.getValue(Blog.class);
LatLng location = new LatLng(blog.lat,blog.lng);
googleMap.addMarker(new MarkerOptions().position(location).title("pedik"));
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
f_database.addListenerForSingleValueEvent(listener);
由于Map的错误使用,必须发生错误。以下是代码的外观。
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
f_database.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
Map data = (Map) child.getValue();
Map mCoordinate = (HashMap)data.get("Blog");
//mCoordinate is a map with values of all the children of Blog
for(String key: mCoordinate.keySet()){
Map mCoordinateChildMap = (HashMap) mCoordinate.get(key)
double latitude = (double) (mCoordinateChildMap.get("lat"));
double longitude = (double) (mCoordinateChildMap.get("lng"));
LatLng location = new LatLng(latitude,longitude);
googleMap.addMarker(new MarkerOptions().position(location).title("pedik"));
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});