Android - dataSnapshot.getValue()在第二次调用时返回null(但不是第一次)

时间:2017-06-06 16:01:55

标签: android firebase firebase-realtime-database

我正在尝试遍历“People”子项的每个索引,以将快照的值设置为适配器中的提供程序。当用户查看适配器时,他们可以看到人名,年龄,头发颜色和眼睛颜色。

My Firebase Database Structure (链接,因为我还无法嵌入图片)

我的功能

public void getInfo() {


 ValueEventListener profileListener = new ValueEventListener() {


    @Override
     public void onDataChange(DataSnapshot dataSnapshot) {


       totalPeople = dataSnapshot.child("People").getChildrenCount();            


       for (int personIndex = 0; personIndex < totalPeople; personIndex++){


          String name =  dataSnapshot.child("People").child(String.valueOf(personIndex)).child("name").getValue().toString();


          String age =  dataSnapshot.child("People").child(String.valueOf(personIndex)).child("age").getValue().toString();


          String hairColor =  dataSnapshot.child("People").child(String.valueOf(personIndex)).child("hairColor").getValue().toString();


          String eyeColor =  dataSnapshot.child("People").child(String.valueOf(personIndex)).child("eyeColor").getValue().toString();


          PersonProvider personProvider = new PersonProvider(name, age, hairColor, eyeColor);

          personActivityAdapter.add(personProvider);
       }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
                Log.e(TAG, "fetching data from firebase failed");
    }
 }; 

 myRef.child("users").child(userId).addValueEventListener(profileListener);
}

错误

06-06 11:38:21.900 31357-31357/com.RentRedi.RentRedi2 E/UncaughtException: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
    at com.RentRedi.RentRedi2.VehicleActivity$10.onDataChange(VehicleActivity.java:380)
    at com.google.android.gms.internal.zzbpx.zza(Unknown Source)
    at com.google.android.gms.internal.zzbqx.zzZV(Unknown Source)
    at com.google.android.gms.internal.zzbra$1.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6121)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

尝试

当我改变时:

String name =  dataSnapshot.child("People").child(String.valueOf(personIndex)).child("name").getValue().toString();

为:

String name =  dataSnapshot.child("People").child(String.valueOf(personIndex)).child("name").toString();

它确实将整个dataSnapshot作为字符串返回,包含其所有键和值。但是,当我添加.getValue()时,第一次触发personIndex后,我得到一个空指针异常。

注意:我还更改了快照的顺序(例如,首先放置age,先放置hairColor,或先放置eyeColor。得到第一个的值,但在第二个时崩溃,说明该值为空。

为什么在第二次调用时返回null,而不是第一次调用null,无论我先放入哪个dataSnapshot子项?

0 个答案:

没有答案