我有这个firebase数据库
我已将列表工具分配到字段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)
我使用了错误的听众还是其他的东西?
答案 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);
始终获取远程数据的最新数据。