Firebase onChildChanged返回null DataSnapshot

时间:2016-08-20 01:23:48

标签: android firebase firebase-realtime-database

我有这个firebase数据库

enter image description here

我已将列表工具分配到字段driverId,以检查此代码是否已更改

myReq = FirebaseDatabase.getInstance().getReference().child("requests").child(userId);
myReq.addChildEventListener(this);

然后我像这样实现了onChildChanged

 @Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {


    String driverID = dataSnapshot.child("driverId").getValue(String.class);

    Toast.makeText(PlacesDemo.this, "GREAT " + driverID, Toast.LENGTH_SHORT).show();

}

然后当我更改driverId它被触发但传递空DataSnapshot时Toast出现(GREATE NULL)

我使用了错误的听众还是其他的东西?

3 个答案:

答案 0 :(得分:2)

在您发布的代码中,mReq是对{user}子requests的引用。该节点有子节点:driverId,to,from,userId。

当您向mReq添加子侦听器时,将为四个子节点中的每一个触发回调。您可以使用以下代码过滤driverId的更改:

@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    if (dataSnapshot.getKey().equals("driverId")) {
        String driverID = dataSnapshot.getValue(String.class);
        Toast.makeText(PlacesDemo.this, "GREAT " + driverID, Toast.LENGTH_SHORT).show();
    }
}

另一种选择是在ValueEventListener位置使用driverId

答案 1 :(得分:1)

调用onChildChanged时,dataSnapshot是更改的子节点,而不是您设置侦听器的父节点。

因此,在这种情况下更改driverId时,dataSnapshot只会为您提供新的driverId和值。 driverId条目本身没有另一个名为“driverId”的子项,因此当您要求时,NULL。您需要直接询问dataSnapshot

的值
String driverID = dataSnapshot.getValue(String.class);

另一种解决方案是将监听器添加到“请求”节点本身,而不是只监听这个特定的“请求”;然后dataSnapshot(即子)将是所有请求数据(VRFq ..键及其所有子项)。然后,您可以使用dataSnapshot.child("driverId")...等从快照中获取数据。

答案 2 :(得分:1)

另一种情况是,即使远程数据库有子项,也可以获得空响应。

如果你有database.setPersistenceEnabled(true);,你可能会遇到本地没有孩子的情况,但在遥控器上会有,直到下次同步。

使用database.getReference("your_node").keepSynced(true);始终获取远程数据的最新数据。

相关问题