为什么我的价值路径不正确-我会得到null

时间:2018-11-19 07:37:16

标签: android firebase

我有以下数据库:

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)

1 个答案:

答案 0 :(得分:1)

dataSnapshot.getChildren()当前遍历您“位置”中的所有子项

当前您有user1user2

当您像在做的那样在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不应进行硬编码,而应使用可获取所需用户的参数。