我正在尝试遍历“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子项?