不知道为什么,但是使用我拥有的代码,我似乎无法获得'isOnline'的值:

dolRef = DatabaseReference dolRef = FirebaseDatabase.getInstance().getReference("DriversOnline");
dolRef = dolRef.child("iosDriver");
dolRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String driverid = ds.getKey();

            // get value of 'isOnline'
            dolRef = dolRef.child(driverid);
            Log.e(TAG, "dolRef: " + dolRef);
            dolRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot dss : dataSnapshot.getChildren()) {
                        String online = dss.child("isOnline").getValue(String.class);
                        Log.e(TAG, "Online: " + online);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});


以下是我的Firebase数据库的一部分:

"DriversOnline" : {
    "iosDriver" : {
      "BruEGfToc8axIWJk1o01fxcwd8I2" : { // driverId
        "isOnline" : "true",
        "latitude" : 45.276,
        "longitude" : -66.064
      }
    }
  }


知道为什么我不能获得null以外的'isOnline'值吗?

最佳答案

我认为您正在将侦听器嵌套到比所需深度更深的层次。

DatabaseReference iosRef = FirebaseDatabase.getInstance().getReference("DriversOnline/iosDriver");
iosRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot driverSnapshot: dataSnapshot.getChildren()) {
            String driverid = driverSnapshot.getKey();

            DataSnapshot isOnlineSnapshot = driverSnapshot.child("isOnline");

            System.out.println(isOnlineSnapshot.getValue(String.class));
        }
    }

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


注意事项:


在这样的代码块中,将4个通用名称为dolRef的变量重新分配4次是一种代码嗅觉。这使得跟踪正在发生的事情以及检查变量是否指向正确的位置变得更加困难。给我每个人一个清楚地表明他们指向的名字的名字,就像我上面所做的那样。
无需附加第二个侦听器,因为isOnline的值恰好在driverSnapshot中。您可以只请求具有正确名称的子快照,然后从中获取值。
不要忽略错误,因为这会隐藏潜在的问题。至少像我上面所做的那样扔掉它们。

08-04 08:03