java - 无法获取 firebase 中除 null 之外的 child 值

标签 java android firebase firebase-realtime-database

不知道为什么,但使用我的代码,我似乎无法获取“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();
    }
});

一些注意事项:

  • 在像这样的代码块中重新分配一个通用命名的 dolRef 变量 4 次是一种代码味道。这使得跟踪正在发生的事情以及检查变量是否指向正确的位置变得更加困难。为每个元素指定一个名称,清楚地表明它们所指向的内容,就像我上面所做的那样。
  • 无需附加第二个监听器,因为 isOnline 的值位于 driverSnapshot 中。您只需请求具有正确名称的子快照,然后请求其中的值。
  • 不要忽略错误,因为它隐藏了潜在的问题。至少扔掉它们,就像我上面所做的那样。

关于java - 无法获取 firebase 中除 null 之外的 child 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54565722/

相关文章:

java - CheckBox 矩阵出现问题,循环不起作用

android - 编译gradle库项目失败

firebase - Cloud Firestore 中的规则如何级联?

javascript - 设置 Firebase Firestore 安全规则,以便只有用户可以 CRUD 自己的数据,而其他所有内容都被忽略

javascript - Firebase:在 cookie 中存储匿名身份验证

java - 看似简单的 Hibernate 查询需要 15-18 秒

java - 我正在尝试将方法中的值存储到之前创建的对象中

Java 8 更新 161 破坏了 HTTPClient Kerberos 身份验证

android - 如何让我的标记每秒移动一次

android - 如何在android中下载谷歌驱动器文件