获取Firebase数据库中的最后一个节点

时间:2019-03-21 12:54:00

标签: java android firebase firebase-realtime-database

我想从Firebase数据库中最后添加的节点访问位置详细信息。您可以在下图看到。它给的错误。请告诉我要纠正的地方。

enter image description here

这是我的代码

DatabaseReference dbReference = FirebaseDatabase.getInstance().getReference();
            Query lastQuery = dbReference.child("User").child("Location").orderByKey().limitToLast(1);

            lastQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    LatLng prevloc = new LatLng(
                            dataSnapshot.child("latitude").getValue(Double.class),
                            dataSnapshot.child("longitude").getValue(Double.class)); 

                  }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });

这是错误

03-21 18:32:10.328 1093-1093/com.jkweblander.mapviewex E/dalvikvm: Could not find class 'dalvik.system.DelegateLastClassLoader', referenced from method ab.b
03-21 18:32:14.068 1093-1093/com.jkweblander.mapviewex E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.jkweblander.mapviewex, PID: 1093
    java.lang.NullPointerException
        at com.jkweblander.mapviewex.MapsActivity$2.onDataChange(MapsActivity.java:240)
        at com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-database@@16.1.0:183)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.1.0:75)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.1.0:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.1.0:55)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5653)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
        at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:1)

要解决此问题,请使用以下代码:

DatabaseReference dbReference = FirebaseDatabase.getInstance().getReference();
Query lastQuery = dbReference.child("User").child("Location").orderByKey().limitToLast(1);
lastQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            double lat = ds.child("latitude").getValue(Double.class);
            double lng = ds.child("longitude").getValue(Double.class);
            LatLng prevloc = new LatLng(lat, lng);
            Log.d(TAG, lat + ", " + lng);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
});

看,我已经使用getChildren()方法来遍历DataSnapshot对象。 logcat中的结果将是Location节点内项目的所有纬度和经度。因此,即使您的DataSnapshot对象中只有一个对象,您也应该对其进行迭代以获取它。