致命错误 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);
我遇到了这个错误,我找不到原因。我尝试从 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);