Firebase中DataSnapshot的getValue()返回空值问题求助
问题分析与解决方案
别着急,我帮你梳理下问题所在,其实都是新手容易踩的小坑,咱们一步步解决:
1. POJO类的Setter方法存在错误
先看你的InstantMessage类里的setUID()方法:
public void setUID(String newUID) { UID = UID; // 这里是核心错误! }
你完全没用到传入的参数newUID,反而把UID赋值给了自己,这就导致Firebase无法正确给这个字段注入数据,自然会返回null。修正成下面这样就好:
public void setUID(String newUID) { UID = newUID; }
2. 未正确处理Firebase的节点结构
你的数据库引用指向的是Users节点,这个节点下应该是多个用户对象(通常每个用户会用UID作为子节点的key),而不是单个InstantMessage对象。所以直接用dataSnapshot.getValue(InstantMessage.class)是拿不到正确数据的,必须遍历dataSnapshot的子节点:
修正后的showData()方法:
private void showData(){ mDatabaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { sampleUser.clear(); // 先清空列表,避免重复添加数据 // 遍历Users节点下的所有用户子节点 for(DataSnapshot userSnapshot : dataSnapshot.getChildren()){ InstantMessage iM1 = userSnapshot.getValue(InstantMessage.class); sampleUser.add(iM1); } studentAdapter.notifyDataSetChanged(); } @Override public void onCancelled(DatabaseError databaseError) { // 建议添加错误日志,方便调试排查 Log.e("FirebaseDebug", "数据读取失败:" + databaseError.getMessage()); } }); }
额外小提示
- 如果你的数据库字段名和POJO字段名不一致,可以用
@PropertyName注解来映射,不过看你的代码应该是匹配的,暂时不需要。 - 每次数据更新时记得清空列表,不然会重复添加旧数据。
内容的提问来源于stack exchange,提问作者Hashim Qureshi
相关产品推荐
相关产品推荐

