致命错误 com.google.firebase.database.DatabaseException:无法将类型 java.lang.String 的值转换为 long

FATAL ERROR com.google.firebase.database.DatabaseException: Failed to convert a value of type java.lang.String to long

我遇到了这个错误,我找不到原因。我尝试从 Firebase 检索纬度和经度。这是我的代码 Java class:

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

    private GoogleMap mMap;
    FirebaseFirestore db;
    private DatabaseReference mUsers;
    private ChildEventListener mChildEventListener;
    Marker marker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        // initializing our firebase firestore.
        db = FirebaseFirestore.getInstance();

        // 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);
        ChildEventListener mChildEventListener;
        mUsers = FirebaseDatabase.getInstance().getReference("Locations");
        mUsers.push().setValue(marker);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        googleMap.setOnMarkerClickListener(this);
        googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
        mUsers.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if(snapshot.exists()) {
                    for (DataSnapshot dataSnapshot:snapshot.getChildren()) {
                        MapAdapter mapAdapter = dataSnapshot.getValue(MapAdapter.class);
                        LatLng location = new LatLng(mapAdapter.latitude, mapAdapter.longitude);
                        mMap.addMarker(new MarkerOptions().position(location)).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));

                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });


    }

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

这是我的适配器代码:

public class MapAdapter {
     public Long latitude,longitude ;

    public MapAdapter() {

    }

    public Long getLatitude() {
        return latitude;
    }

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

    public Long getLongitude() {
        return longitude;
    }

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

enter image description here

E/AndroidRuntime:致命异常:main 进程:com.example.wss503,PID:18029 com.google.firebase.database.DatabaseException: 无法将 java.lang.String 类型的值转换为 long 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertLong(CustomClassMapper.java:385) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToPrimitive(CustomClassMapper.java:296) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:215) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToType(CustomClassMapper.java:179) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access100 美元(CustomClassMapper.java:48) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:593) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:563) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:433) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80) 在 com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203) 在 com.example.wss503.MapsActivity$1.onDataChange(MapsActivity.java:62) 在 com.google.firebase.database.Query$1.onDataChange(Query.java:191) 在 com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) 在 com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) 在 com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

您收到以下错误:

FATAL ERROR com.google.firebase.database.DatabaseException: Failed to convert a value of type java.lang.String to long

因为您试图将纬度和经度读取为 long 值,而在数据库中存储为字符串,这是不正确的。看到双引号了吗?

要解决这个问题,您可以将数据库中的字段类型更改为数字,并保持代码不变,或者像这样更改 MapAdapter class:

public class MapAdapter {
    public String latitude, longitude;

    public MapAdapter() {}

    public String getLatitude() {
        return latitude;
    }

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

    public String getLongitude() {
        return longitude;
    }

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

你也可以这样修改代码:

MapAdapter mapAdapter = dataSnapshot.getValue(MapAdapter.class);
long latitude = Long.parseLong(mapAdapter.latitude);
long longitude = Long.parseLong(mapAdapter.longitude);
LatLng location = new LatLng(latitude, longitude);