我有以下数据库:
database
|
places
|
|____user1
| |_____outside: "yes"
|
|____user2
|_____outside: "no"
我正在这样获取数据:
mDatabaseReference = FirebaseDatabase.getInstance().getReference("places");
ValueEventListener placesListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){
//this won't work
String place = datas.child("user1").child("outside").getValue().toString();
}
mDatabaseReference.addValueEventListener(placesListener);
但是它不起作用,当我启动我的应用程序时,我发现它为null并且应用程序崩溃。
根据要求记录日志崩溃:
Process: com.example.places, PID: 32431
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at com.example.places.MainActivity$1.onDataChange(MainActivity.java:44)
at com.google.firebase.database.obfuscated.zzap.zza(com.google.firebase:firebase-database@@16.0.3:75)
at com.google.firebase.database.obfuscated.zzca.zza(com.google.firebase:firebase-database@@16.0.3:63)
at com.google.firebase.database.obfuscated.zzcd$1.run(com.google.firebase:firebase-database@@16.0.3:55)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
答案 0 :(得分:1)
dataSnapshot.getChildren()
当前遍历您“位置”中的所有子项
当前您有user1
和user2
。
当您像在做的那样在for循环中遍历它们时
String place = datas.child("user1").child("outside").getValue().toString();
您最终将尝试查找不存在的datas.child(“ user1”)。
在for循环中,您可以使用
datas.child("outside").getValue().toString();
如果您记录此内容,则将首先找到打印的user1
外部值,然后是user2
。
如果需要user1,则可以在其中检查密钥的地方添加if语句
if(datas.getKey().toString().equals("user1"))
然后执行您需要的操作。 user1
不应进行硬编码,而应使用可获取所需用户的参数。