我試圖從實時資料庫中顯示用戶的當前位置,但它沒有顯示在地圖上,資料庫的結構如下:
{
"Blocked Users" : {
"RCX2HZXIwlSmMHFgDytf1DgZBgi2" : 0
},
"User Location" : {
"RCX2HZXIwlSmMHFgDytf1DgZBgi2" : {
"latitude" : 37.4035483,
"longitude" : -122.097715
}
},
"Users" : {
"RCX2HZXIwlSmMHFgDytf1DgZBgi2" : {
"Alert Level" : "High",
"Emergency Type" : "Natural Disaster",
"address" : "Lapaz Tarlac",
"emergencyNum" : "0981232387346",
"name" : "Rafael Campos",
"phoneNum" : "0981233445675"
}
}
}
使用 onMapReady 中的此代碼從 Firebase 獲取位置時,我收到了 NPE,我應該如何解決這個問題?
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
mMap = googleMap;
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference("Users");
DatabaseReference uidRef = rootRef.child("User Location");
uidRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (task.isSuccessful()) {
DataSnapshot snapshot = task.getResult();
Double latitude = snapshot.child("latitude").getValue(Double.class);
Double longitude = snapshot.child("longitude").getValue(Double.class);
LatLng location = new LatLng(latitude, longitude);
mMap.addMarker(new MarkerOptions().position(location).title(getCompleteAddress(latitude, longitude)));
mMap.moveCamera(CameraUpdateFactory.newLatLng(location));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location,14F));
Log.d("TAG", "latitude, longitude");
} else {
Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
}
}
});
}
這是堆疊跟蹤:
2021-10-23 11:19:19.139 12376-12376/com.example.rescuealertadmin E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.rescuealertadmin, PID: 12376
java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
at com.example.rescuealertadmin.RetrieveMapsActivity$4.onComplete(RetrieveMapsActivity.java:202)
at com.google.android.gms.tasks.zzi.run(com.google.android.gms:play-services-tasks@@17.2.1:1)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
uj5u.com熱心網友回復:
您的User Location路徑有一個用戶串列,因此您onComplete需要DataSnapshot通過回圈結果來處理具有子節點串列的事實:
uidRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (task.isSuccessful()) {
DataSnapshot snapshot = task.getResult();
for (DataSnapshot child: snapshot.getChildren()) {
Double latitude = child.child("latitude").getValue(Double.class);
Double longitude = child.child("longitude").getValue(Double.class);
LatLng location = new LatLng(latitude, longitude);
...
}
});
uj5u.com熱心網友回復:
您正在錯誤的節點上查找資料。
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference("Users");
在這里您保存了用戶資訊
DatabaseReference uidRef = rootRef.child("User Location");
然后您將進一步進入“用戶”節點。但是“用戶”節點中沒有“用戶位置”。
如果你有 UID,你可以得到這樣的資料
DatabaseReference uidRef = FirebaseDatabase.getInstance().getReference("User Location").child(UID);
uj5u.com熱心網友回復:
您收到以下錯誤:
java.lang.NullPointerException:嘗試在空物件參考上呼叫虛擬方法“double java.lang.Double.doubleValue()”
因為您在代碼中使用了不正確的參考。正如我所見,“緯度”和“經度”都是 UID 的直接子代。因此,請更改以下代碼行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference("Users");
DatabaseReference uidRef = rootRef.child("User Location");
uidRef.get().addOnCompleteListener(/* ... /*);
到:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("User Location").child(uid);
uidRef.get().addOnCompleteListener(/* ... /*);
其余代碼可能保持不變。
uj5u.com熱心網友回復:
您提供了錯誤的參考路徑,這就是您獲得 NPE 的原因。
將其轉換為:
DatabaseReference rootRef =
FirebaseDatabase.getInstance().getReference("Users");
DatabaseReference uidRef = rootRef.child("User Location");
uidRef.get().addOnCompleteListener(/* ... /*);
到
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef =
FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("User Location").child(uid);
uidRef.get().addOnCompleteListener(/* ... /*);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/335941.html
標籤:爪哇 安卓 火力基地 Firebase 实时数据库 谷歌云平台
