Android中Firebase的OnDataChange未触发问题求助
我看了你这段监听代码,结合你描述的数据库结构(id节点下包含多个push生成的子节点,每个子节点存储文本类型字段),问题大概率出在这几个地方,咱们一步步排查:
1. 监听器类型选得不对
你现在用的ValueEventListener,会在初始加载数据和查询结果整体发生变化时触发。但如果你的需求是监听新增条目,其实更适合用ChildEventListener的onChildAdded方法——它会对每个新增的子节点单独触发,包括初始加载时的现有节点,以及之后每一个新添加的节点。
把你的代码改成这样试试:
public void dataListener() { Query lastQuery = mDatabase.child("id").orderByKey().limitToLast(1); lastQuery.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { Log.d("ChildAdded", dataSnapshot.toString()); getAddedUpdates(dataSnapshot); } @Override public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {} @Override public void onChildRemoved(DataSnapshot dataSnapshot) {} @Override public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {} @Override public void onCancelled(DatabaseError databaseError) { Log.d("ChildError", databaseError.toString()); } }); }
2. 数据库权限规则限制了实时读取
如果你的数据库规则设置得太严格,只允许写入但不允许实时读取,那监听器根本无法建立持久连接。你可以先去Firebase控制台检查数据库规则,测试阶段可以暂时开放权限(上线后一定要改成符合业务需求的严格规则):
{ "rules": { ".read": true, ".write": true } }
3. 确认数据库引用路径是否正确
要确保mDatabase是指向你的数据库根节点的正确引用,比如你是不是用FirebaseDatabase.getInstance().getReference()初始化的?如果mDatabase指向的是其他子节点,那你的查询路径child("id")就会出错,自然监听不到数据变化。
4. 排查网络与Firebase连接状态
有时候设备网络不稳定,或者Firebase的实时连接没有正常建立。你可以在Logcat里搜索FirebaseDatabase相关日志,看看有没有类似Connection established或者Connection failed的提示,确认网络连接是否正常。
你提到重启应用后用singleValueEventListener能拿到数据,说明数据确实成功写入了,只是实时监听的逻辑有问题。优先试试上面的ChildEventListener方案,应该就能解决你的问题啦。
内容的提问来源于stack exchange,提问作者BryceSoker

