空对象引用上的 Firebase onDataChange 方法
Firebase onDataChange method on null object reference
这就是我想要的样子,但我得到的是空对象引用
(DataSnapshot wayPointsChild : wayPointsSnapshotChild.getChildren()) {
里面
那两个属性让一切崩溃
"timeStamp" : "2016/04/27 18:28:52",
"travelType" : "work"
JSON FROMAT
"waypoints" : {
"-KHB1VjqUdO90vxj9XCh" : {
"timeStamp" : "2016/04/27 18:28:52",
"travelType" : "work"
"-KHB1VjqUdO90vxj9XCi" : {
"latitude" : 58.337679,
"longitude" : 11.912757
},
"-KHB1ZykbwgXM9sPNie9" : {
"latitude" : 58.281384,
"longitude" : 12.294495
},
},
"-KHpPe06hLpPttuGZ0rZ" : {
"timeStamp" : "2016/04/27 18:28:52",
"travelType" : "private"
"-KHpPe07pE5ZYn4JGiZ1" : {
"latitude" : 58.281384,
"longitude" : 12.294495
},
"randomid1212" : {
"latitude" : 57.689903,
"longitude" : 11.989792
},
"randomid1213" : {
"latitude" : 57.689905,
"longitude" : 11.989795
},
}
当前的onDataChange()方法
mUserRef.addValueEventListener(new ValueEventListener() {
//this keeps per-user list of points
List<MyWaypoint> userWayPointsList = new ArrayList<MyWaypoint>();
@Override
public void onDataChange(DataSnapshot wayPointsDataSnapshot) {
if (wayPointsDataSnapshot.getChildrenCount() > 0) {
for (DataSnapshot wayPointsSnapshotChild : wayPointsDataSnapshot.getChildren()) {
Log.i("FireBaseTester", "For-Loop :: wayPointsSnapshotChild.getValue() : " + wayPointsSnapshotChild.getValue());
if (wayPointsSnapshotChild.getChildrenCount() > 0) {
// Temporary list
List<String> latLngListTemp = new ArrayList<>();
// THIS Gives me the error because it get used in the next for loop for some reason.
wayPointsSnapshotChild.child("timeStamp").getValue();
for (DataSnapshot wayPointsChild : wayPointsSnapshotChild.getChildren()) {
//this is where we get the Lat and Lon
double latitude = Double.parseDouble(wayPointsChild.child("latitude").getValue().toString());
double longitude = Double.parseDouble(wayPointsChild.child("longitude").getValue().toString());
Log.i("FireBaseTester", "latitude = " + latitude + " , longitude = " + longitude);
latLngListTemp.add(latitude + ", " + longitude);
}
// List containing a nested List<List<String>>
latitudeNlongitude.add(latLngListTemp);
}
}
}
//here you can assign the points to the user
Log.i("FireBaseTester", "There are " + userWayPointsList.size() + " Points for User");
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.e("FireBaseTester", "onCancelled - wayPointRef Error is " + firebaseError.getMessage());
}
});
} else {
Log.i("FireBaseTester", "No WayPoints Data Received");
}
LOGCAT
FATAL EXCEPTION: main
Process: com.example.rasmusjosefsson.rjcar, PID: 25446
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String java.lang.Object.toString()' on a null object
reference
at
com.example.rasmusjosefsson.rjcar.demo.MapListActivityRealBack2.onDataChange(MapListActivityRealBack2.java:122)
at
com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:56)
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
at
com.firebase.client.core.view.EventRaiser.run(EventRaiser.java:38)
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)
这些行说明了问题:
wayPointsSnapshotChild.child("timeStamp").getValue();
for (DataSnapshot wayPointsChild : wayPointsSnapshotChild.getChildren()) {
{
double latitude = Double.parseDouble(wayPointsChild.child("latitude").getValue().toString());
在 wayPointSnapshotChild
上调用 getChildren 将 return timestamp
值作为子项之一,它没有名为 latitude
的子项。
您可以像这样构建数据:
"waypoints" : {
"-KHB1VjqUdO90vxj9XCh" : {
"timeStamp" : "2016/04/27 18:28:52",
"travelType" : "work"
"points": {
"-KHB1VjqUdO90vxj9XCi" : {
"latitude" : 58.337679,
"longitude" : 11.912757
},
"-KHB1ZykbwgXM9sPNie9" : {
"latitude" : 58.281384,
"longitude" : 12.294495
}
}
}
然后在你的 for
循环中调用它:
wayPointsSnapshotChild.child("points").getChildren()
那么内循环将只接收包含纬度和经度属性的 wayPointChild 对象。
这就是我想要的样子,但我得到的是空对象引用
(DataSnapshot wayPointsChild : wayPointsSnapshotChild.getChildren()) {
那两个属性让一切崩溃
"timeStamp" : "2016/04/27 18:28:52",
"travelType" : "work"
JSON FROMAT
"waypoints" : {
"-KHB1VjqUdO90vxj9XCh" : {
"timeStamp" : "2016/04/27 18:28:52",
"travelType" : "work"
"-KHB1VjqUdO90vxj9XCi" : {
"latitude" : 58.337679,
"longitude" : 11.912757
},
"-KHB1ZykbwgXM9sPNie9" : {
"latitude" : 58.281384,
"longitude" : 12.294495
},
},
"-KHpPe06hLpPttuGZ0rZ" : {
"timeStamp" : "2016/04/27 18:28:52",
"travelType" : "private"
"-KHpPe07pE5ZYn4JGiZ1" : {
"latitude" : 58.281384,
"longitude" : 12.294495
},
"randomid1212" : {
"latitude" : 57.689903,
"longitude" : 11.989792
},
"randomid1213" : {
"latitude" : 57.689905,
"longitude" : 11.989795
},
}
当前的onDataChange()方法
mUserRef.addValueEventListener(new ValueEventListener() {
//this keeps per-user list of points
List<MyWaypoint> userWayPointsList = new ArrayList<MyWaypoint>();
@Override
public void onDataChange(DataSnapshot wayPointsDataSnapshot) {
if (wayPointsDataSnapshot.getChildrenCount() > 0) {
for (DataSnapshot wayPointsSnapshotChild : wayPointsDataSnapshot.getChildren()) {
Log.i("FireBaseTester", "For-Loop :: wayPointsSnapshotChild.getValue() : " + wayPointsSnapshotChild.getValue());
if (wayPointsSnapshotChild.getChildrenCount() > 0) {
// Temporary list
List<String> latLngListTemp = new ArrayList<>();
// THIS Gives me the error because it get used in the next for loop for some reason.
wayPointsSnapshotChild.child("timeStamp").getValue();
for (DataSnapshot wayPointsChild : wayPointsSnapshotChild.getChildren()) {
//this is where we get the Lat and Lon
double latitude = Double.parseDouble(wayPointsChild.child("latitude").getValue().toString());
double longitude = Double.parseDouble(wayPointsChild.child("longitude").getValue().toString());
Log.i("FireBaseTester", "latitude = " + latitude + " , longitude = " + longitude);
latLngListTemp.add(latitude + ", " + longitude);
}
// List containing a nested List<List<String>>
latitudeNlongitude.add(latLngListTemp);
}
}
}
//here you can assign the points to the user
Log.i("FireBaseTester", "There are " + userWayPointsList.size() + " Points for User");
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.e("FireBaseTester", "onCancelled - wayPointRef Error is " + firebaseError.getMessage());
}
});
} else {
Log.i("FireBaseTester", "No WayPoints Data Received");
}
LOGCAT
FATAL EXCEPTION: main Process: com.example.rasmusjosefsson.rjcar, PID: 25446 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference at com.example.rasmusjosefsson.rjcar.demo.MapListActivityRealBack2.onDataChange(MapListActivityRealBack2.java:122) at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:56) at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45) at com.firebase.client.core.view.EventRaiser.run(EventRaiser.java:38) 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)
这些行说明了问题:
wayPointsSnapshotChild.child("timeStamp").getValue();
for (DataSnapshot wayPointsChild : wayPointsSnapshotChild.getChildren()) {
{
double latitude = Double.parseDouble(wayPointsChild.child("latitude").getValue().toString());
在 wayPointSnapshotChild
上调用 getChildren 将 return timestamp
值作为子项之一,它没有名为 latitude
的子项。
您可以像这样构建数据:
"waypoints" : {
"-KHB1VjqUdO90vxj9XCh" : {
"timeStamp" : "2016/04/27 18:28:52",
"travelType" : "work"
"points": {
"-KHB1VjqUdO90vxj9XCi" : {
"latitude" : 58.337679,
"longitude" : 11.912757
},
"-KHB1ZykbwgXM9sPNie9" : {
"latitude" : 58.281384,
"longitude" : 12.294495
}
}
}
然后在你的 for
循环中调用它:
wayPointsSnapshotChild.child("points").getChildren()
那么内循环将只接收包含纬度和经度属性的 wayPointChild 对象。