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