尝试从 Firebase 获取纬度和经度数据
Trying to fetch Latitude and Longitude data from Firebase
所以我试图根据来自我的 firebase
的纬度和经度数据在 google 地图上显示标记
我的 Firebase 结构是这样的:
现在这是我显示标记的代码
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mReff=FirebaseDatabase.getInstance().getReference().child("01");
mReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot s : dataSnapshot.getChildren()){
String lat =s.child("latitude").getValue().toString();
String lng =s.child("longitude").getValue().toString();
double latitude=Double.parseDouble(lat);
double longitude=Double.parseDouble(lng);
LatLng lokasi = new LatLng(latitude,longitude);
mMap.addMarker(new MarkerOptions().position(lokasi).title(s.child("nama").getValue().toString()));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
但我总是遇到这个错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.proyekakhir.Aplikasi, PID: 1583
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at com.proyekakhir.Aplikasi.Lacak.onDataChange(Lacak.java:48)
at com.google.firebase.database.Query.onDataChange(com.google.firebase:firebase-database@@17.0.0:184)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@17.0.0:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@17.0.0:63)
at com.google.firebase.database.core.view.EventRaiser.run(com.google.firebase:firebase-database@@17.0.0:55)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6499)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:442)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
您不需要使用那个 for 循环,因为您已经设置了对 01
节点的引用。
mReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
double latitude = Double.parseDouble(dataSnapshot.child("latitude").getValue().toString());
double longitude = Double.parseDouble(dataSnapshot.child("longitude").getValue().toString());
LatLng lokasi = new LatLng(latitude,longitude);
mMap.addMarker(new
MarkerOptions().position(lokasi).title("Title"));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
mReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
HashMap<String, Double> data = (HashMap<String, Double>) dataSnapshot.getValue();
double latitude = data.get("latitude");
double longitude = data.get("longitude");
// your further code.
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
所以我试图根据来自我的 firebase
的纬度和经度数据在 google 地图上显示标记我的 Firebase 结构是这样的:
现在这是我显示标记的代码
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mReff=FirebaseDatabase.getInstance().getReference().child("01");
mReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot s : dataSnapshot.getChildren()){
String lat =s.child("latitude").getValue().toString();
String lng =s.child("longitude").getValue().toString();
double latitude=Double.parseDouble(lat);
double longitude=Double.parseDouble(lng);
LatLng lokasi = new LatLng(latitude,longitude);
mMap.addMarker(new MarkerOptions().position(lokasi).title(s.child("nama").getValue().toString()));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
但我总是遇到这个错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.proyekakhir.Aplikasi, PID: 1583
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at com.proyekakhir.Aplikasi.Lacak.onDataChange(Lacak.java:48)
at com.google.firebase.database.Query.onDataChange(com.google.firebase:firebase-database@@17.0.0:184)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@17.0.0:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@17.0.0:63)
at com.google.firebase.database.core.view.EventRaiser.run(com.google.firebase:firebase-database@@17.0.0:55)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6499)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:442)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
您不需要使用那个 for 循环,因为您已经设置了对 01
节点的引用。
mReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
double latitude = Double.parseDouble(dataSnapshot.child("latitude").getValue().toString());
double longitude = Double.parseDouble(dataSnapshot.child("longitude").getValue().toString());
LatLng lokasi = new LatLng(latitude,longitude);
mMap.addMarker(new
MarkerOptions().position(lokasi).title("Title"));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
mReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
HashMap<String, Double> data = (HashMap<String, Double>) dataSnapshot.getValue();
double latitude = data.get("latitude");
double longitude = data.get("longitude");
// your further code.
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});