【问题标题】:I can't get markers from firebase我无法从 firebase 获取标记
【发布时间】:2018-06-08 14:14:54
【问题描述】:

当我开始这个活动时,我的应用程序会停止。我需要从数据库中获取坐标并放置标记。不知道哪里出了问题。

我的数据库:

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) {

        }
    });

【问题讨论】:

  • 请更新错误日志。

标签: android google-maps firebase firebase-realtime-database google-maps-markers


【解决方案1】:

尝试这样检索 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) {

        }
    });

【讨论】:

  • 感谢这个真正的帮助我))
【解决方案2】:

首先,如果您想获取 Blog 的所有子项,那么您应该在 DatabaseReference f_database = FirebaseDatabase.getInstance().getReference("Blog");

上注明您的参考信息

当您将您的 Firebase 引用放在 DatabaseReference f_database = FirebaseDatabase.getInstance().getReference() 上时。这将获取数据库的所有节点,在您的情况下为 Blogusers。如果您需要博客信息,则无需获取用户数据。对于 firebase,这是一种非常糟糕的代码实践。

其次,正如@Benjith binja 建议的那样,您可以获取所有博客 的子项以获取纬度和经度。或者,您应该创建一个博客对象并获取数据。这是一个很好的做法。 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);

错误一定是由于地图的错误使用而发生的。这是您的代码的外观。

@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) {

    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2019-04-21
    • 2020-08-05
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多