从Google Firebase实时数据库读取Google Maps标记数据时遇到问题

时间:2018-07-11 13:32:53

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

我有一个Firebase Realtime数据库,用于存储Google Maps Marker数据。看起来像这样:Firebase Database

我的应用程序可以选择将自己的标记添加到数据库,我的问题是我的应用程序仅从Studio 1和T1读取信息,而不从.push()添加的随机密钥读取信息。当我通过应用程序添加标记时。关于如何获取它以读取随机密钥下的标记信息的任何想法?我的代码如下:

public class MapsActivity extends FragmentActivity implements 
OnMapReadyCallback, GoogleMap.OnMarkerClickListener {

FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference mProfileRef = firebaseDatabase.getReference("Studios");
ChildEventListener mChildEventListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    Button addAStudio = (Button) findViewById(R.id.addAStudio);
    addAStudio.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(MapsActivity.this, Rent.class);
            startActivity(intent);
        }
    });
}

@Override
public void onMapReady(GoogleMap googleMap){
    googleMap.setOnMarkerClickListener(this);
    LatLng  Copenhagen = new LatLng(55.67, 12.56);
    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(Copenhagen, 18));
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    //get marker info from Firebase Database and add to map
    addMarkersToMap(googleMap);

    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    googleMap.setMyLocationEnabled(true);
}

@Override
public void onStop(){
    if(mChildEventListener != null)
        mProfileRef.removeEventListener(mChildEventListener);
    super.onStop();
}

private void addMarkersToMap(final GoogleMap map){

    mChildEventListener = mProfileRef.addChildEventListener(new ChildEventListener() {



        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                FirebaseMarker marker = dataSnapshot.getValue(FirebaseMarker.class);
                String StudioName = marker.getStudioName();
                String StudioAdress = marker.getStudioAddress();
                String StudioDescription = marker.getStudioDescription();
                double latitude = marker.getLatitude();
                double longitude = marker.getLongitude();
                LatLng location = new LatLng(latitude, longitude);

                map.addMarker(new MarkerOptions()
                        .position(location)
                        .title(StudioName)
                        .snippet(StudioAdress)
                        .snippet(StudioDescription))
                        .showInfoWindow();

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });
}

@Override
public boolean onMarkerClick(Marker marker) {
    return false;
}

public class FirebaseMarker {

public String studioName;
public String studioDescription;
public String studioAddress;
public double latitude;
public double longitude;


//required empty constructor
public FirebaseMarker() {
}

public FirebaseMarker(String studioName, String studioDescription, String studioAdress, double latitude, double longitude) {
    this.studioName = studioName;
    this.studioDescription = studioDescription;
    this.studioAddress = studioAdress;
    this.latitude = latitude;
    this.longitude = longitude;
}

public String getStudioName() {
    return studioName;
}

public void setStudioName(String studioName) {
    this.studioName = studioName;
}

public String getStudioDescription() {
    return studioDescription;
}

public void setStudioDescription(String studioDescription) {
    this.studioDescription = studioDescription;
}

public String getStudioAddress() {
    return studioAddress;
}

public void setStudioAddress(String studioAddress) {
    this.studioAddress = studioAddress;
}

public double getLongitude() {
    return longitude;
}

public void setLongitude(double longitude) {
    this.longitude = longitude;
}

public double getLatitude() {
    return latitude;
}

public void setLatitude(double latitude) {
    this.latitude = latitude;
}

}

最后在哪里向数据库添加新标记:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_rent);
    saveStudio = findViewById(R.id.saveStudio);
    studioNameTextField = findViewById(R.id.studioNameTextField);
    studioInfoTextField = findViewById(R.id.studioInfoTextField);
    studioAdressTextField = findViewById(R.id.studioAdressTextField);
    mDatabase = FirebaseDatabase.getInstance();
    mDataBaseRef = mDatabase.getReference("Studios");
    saveStudio = findViewById(R.id.saveStudio);


    saveStudio.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {

                Map<String, FirebaseMarker> newStudioAdd = new HashMap<>();

                newStudioAdd.put(studioNameTextField.getText().toString(),
                        new FirebaseMarker(
                                studioNameTextField.getText().toString(),
                                studioInfoTextField.getText().toString(),
                                studioAdressTextField.getText().toString(),
                                53.669115, 12.560311
                        )
                );

                mDataBaseRef.push().setValue(newStudioAdd);

          Intent intent = new Intent(Rent.this, MapsActivity.class);
          startActivity(intent);

        }
    });

}

目前,经纬度已经过硬编码,因为我希望它在继续之前先读取标记。

1 个答案:

答案 0 :(得分:0)

之所以会这样,是因为Studio 1T1的路径与T2不同。正如我在您的数据库架构中看到的那样,您的T2是由-LH-3 ... GbsF方法生成的一个额外的子项(push())。为了正确显示所有这些对象,您需要为所有对象使用相同的路径。因此,您可以通过使用Studio 1方法以相同的方式添加T1push()或不使用T2来添加push()来实现此目的方法。

FirebaseMarker firebaseMarker = new FirebaseMarker(
    studioNameTextField.getText().toString(),
    studioInfoTextField.getText().toString(),
    studioAdressTextField.getText().toString(),
    53.669115, 12.560311);
mDataBaseRef.push().setValue(firebaseMarker);

假设Studios节点是Firebase数据库的直接子级,可以通过以下方法在地图上添加标记:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference studiosRef = rootRef.child("Studios");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            FirebaseMarker marker = dataSnapshot.getValue(FirebaseMarker.class);
            String StudioName = marker.getStudioName();
            String StudioAdress = marker.getStudioAddress();
            String StudioDescription = marker.getStudioDescription();
            double latitude = marker.getLatitude();
            double longitude = marker.getLongitude();
            LatLng location = new LatLng(latitude, longitude);

            map.addMarker(new MarkerOptions()
                    .position(location)
                    .title(StudioName)
                    .snippet(StudioAdress)
                    .snippet(StudioDescription))
                    .showInfoWindow();
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
studiosRef.addListenerForSingleValueEvent(valueEventListener);