不太了解从Firebase数据库检索标记位置

时间:2019-01-22 23:26:33

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

我一直在寻找答案并尝试了许多教程,但仍无法解决问题。我正在开发一个应用程序,用户可以在地图上添加标记,其他所有用户都可以看到标记。但是我无法使其工作,因为数据库中的标记永远不会显示。

这是我从数据库读取的代码:

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
    

有任何帮助。

4 个答案:

答案 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。