Zephyros
Zephyros

Reputation: 77

Firebase databse can't retrieved latitude and longitude and display on map

OK my question is simple, I want my google map to display the selected location on the map, I inserted the latitude and longitude myself into the database instead of through programming code, not sure whether this affects anything but I figure I let you guys know. I used 2 methods which I commented out in my code and each of them gave me different errors. Not sure I used the correct method but I need your guys help, almost done with my app.

MapsActivity:

private void getLocation(){
    databaseLocation.child("Location").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            Bundle b = getIntent().getExtras();
            if (b != null) {
                String sports = b.getString("TeamSport");


                for (DataSnapshot child : dataSnapshot.getChildren()) {
                    if (child.getKey().equals(sports)) {
                        if (child.getKey().equals("latitude")) {
                            //latitude = Double.parseDouble(String.valueOf(child.getValue()));
                            //latitude = child.getValue(Double.class);
                        } else {
                            //longitude = Double.parseDouble(String.valueOf(child.getValue()));
                            //longitude = child.getValue(Double.class);
                        }

                        // Create LatLng for each locations
                        LatLng latlng = new LatLng(latitude, longitude);

                        mMap.addMarker(new MarkerOptions().position(latlng).draggable(true));
                        mMap.moveCamera(CameraUpdateFactory.newLatLng(latlng));
                        //Setting onMarkerDragListener to track the marker drag
                        mMap.setOnMarkerDragListener(MapsActivity.this);
                        //Adding a long click listener to the map
                        mMap.setOnMapLongClickListener(MapsActivity.this);

                        moveMap();
                    } else {
                        Toast.makeText(getApplicationContext(), "No location found.", Toast.LENGTH_LONG).show();
                    }
                }
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

@Override
public void onConnected(Bundle bundle) {

    getLocation();

}

My database:

enter image description here

Error when using child.getvalue():

com.google.firebase.database.DatabaseException: Failed to convert a value of type java.util.HashMap to double
                                                                        at com.google.android.gms.internal.zzbtg.zzaD(Unknown Source)
                                                                        at com.google.android.gms.internal.zzbtg.zzc(Unknown Source)
                                                                        at com.google.android.gms.internal.zzbtg.zzb(Unknown Source)
                                                                        at com.google.android.gms.internal.zzbtg.zza(Unknown Source)
                                                                        at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
                                                                        at com.example.user.stfv2.MapsActivity$1.onDataChange(MapsActivity.java:148)
                                                                        at com.google.firebase.database.Query$1.onDataChange(Unknown Source)
                                                                        at com.google.android.gms.internal.zzbpx.zza(Unknown Source)
                                                                        at com.google.android.gms.internal.zzbqx.zzZS(Unknown Source)
                                                                        at com.google.android.gms.internal.zzbra$1.run(Unknown Source)
                                                                        at android.os.Handler.handleCallback(Handler.java:739)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                        at android.os.Looper.loop(Looper.java:148)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

error when using parseDouble method:

java.lang.NumberFormatException: Invalid double: "{latitude=1.857204, longitude=103.087338}"
                                                                      at java.lang.StringToReal.invalidReal(StringToReal.java:63)
                                                                      at java.lang.StringToReal.initialParse(StringToReal.java:114)
                                                                      at java.lang.StringToReal.parseDouble(StringToReal.java:282)
                                                                      at java.lang.Double.parseDouble(Double.java:301)
                                                                      at com.example.user.stfv2.MapsActivity$1.onDataChange(MapsActivity.java:147)
                                                                      at com.google.firebase.database.Query$1.onDataChange(Unknown Source)
                                                                      at com.google.android.gms.internal.zzbpx.zza(Unknown Source)
                                                                      at com.google.android.gms.internal.zzbqx.zzZS(Unknown Source)
                                                                      at com.google.android.gms.internal.zzbra$1.run(Unknown Source)
                                                                      at android.os.Handler.handleCallback(Handler.java:739)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at android.os.Looper.loop(Looper.java:148)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

In here, we can see it gets the right data i wanted.

Let me know if there's insufficient information. Thanks in advance.

Upvotes: 0

Views: 868

Answers (1)

Bob Snyder
Bob Snyder

Reputation: 38299

These changes should produce better results:

for (DataSnapshot child : dataSnapshot.getChildren()) {
    if (child.getKey().equals(sports)) {
        // child is a snapshot of a sport location; Basketball or Football
        // latitude and longitude are children of the sport shapshot
        latitude = child.child("latitude").getValue(Double.class);
        longitude = child.child("longitude").getValue(Double.class);

        // Create LatLng for each locations
        LatLng latlng = new LatLng(latitude, longitude);

        ...
    } else {
        Toast.makeText(getApplicationContext(), "No location found.", Toast.LENGTH_LONG).show();
    }
}

Upvotes: 1

Related Questions