Firebase数据库数据获取异常:bikingTime显示为0的问题排查
解决Firebase实时数据库获取bikingTime始终为0的问题
咱们一步步来排查你遇到的问题,毕竟从Firebase拿数据时出现默认值,大概率是路径、实体类、异步逻辑或者权限这几个环节出了问题:
一、先确认数据库引用路径没写错
首先得保证你的引用路径和Firebase控制台里的节点结构完全对应,比如正确的引用写法应该是这样:
// 获取到目标节点的引用 DatabaseReference targetRef = database.getReference("XqU1a6jrvKSLf4ulhI3LkOhChE92").child("ahmad");
要是路径里的节点名(比如ahmad或者父节点ID)写错了,或者大小写不匹配,Firebase找不到对应数据,就会返回默认值0。
二、检查你的child实体类配置
Firebase要把数据库数据映射到你的对象,实体类得满足几个要求:
- 必须有无参构造函数(Firebase反序列化需要)
- 字段名和数据库里的键名完全一致(或者用
@PropertyName注解指定) - 字段类型要匹配(比如数据库里
bikingTime是数字,你的字段就得是int/long,不能是String)
举个正确的实体类例子:
public class Child { private int bikingTime; // 必须保留无参构造 public Child() {} public int getBikingTime() { return bikingTime; } // 如果字段名和数据库键名一致,注解可以不加,但加上更稳妥 @PropertyName("bikingTime") public void setBikingTime(int bikingTime) { this.bikingTime = bikingTime; } }
要是没无参构造,Firebase没法创建对象,自然只能给你默认的0值。
三、别忽略Firebase的异步特性!
这是很多新手踩坑的点:Firebase读取数据是异步操作,你不能刚创建Child对象就直接拿bikingTime,这时候数据还没从服务器返回呢!
得用监听来等待数据加载完成,比如用addListenerForSingleValueEvent(只读取一次)或者addValueEventListener(实时监听变化):
// 先拿到你的TextView实例 TextView bikingTimeTv = findViewById(R.id.your_textview_id); DatabaseReference targetRef = database.getReference("XqU1a6jrvKSLf4ulhI3LkOhChE92").child("ahmad"); targetRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // 先判断节点是否存在 if (dataSnapshot.exists()) { Child myChild = dataSnapshot.getValue(Child.class); if (myChild != null) { // 数据加载完成,更新TextView bikingTimeTv.setText(String.valueOf(myChild.getBikingTime())); } } else { bikingTimeTv.setText("找不到对应数据"); } } @Override public void onCancelled(DatabaseError databaseError) { // 读取失败的情况,打印错误信息方便排查 Log.e("FirebaseError", "读取数据失败: " + databaseError.getMessage()); bikingTimeTv.setText("读取失败"); } });
四、检查数据库权限规则
默认情况下,Firebase实时数据库的规则是只允许认证过的用户读写。如果你的App还没做用户认证,或者规则设置成了read: false,那读取请求会被拒绝,也会返回默认值0。
开发阶段可以暂时把规则改成这样(上线后一定要改回安全规则!):
{ "rules": { ".read": true, ".write": true } }
五、最后确认数据库里的数值真的不为0
去Firebase控制台的实时数据库页面,手动检查XqU1a6jrvKSLf4ulhI3LkOhChE92/ahmad下的bikingTime字段,是不是真的存了非0的数值——万一你存的时候就写错了,那读出来自然是0啦。
内容的提问来源于stack exchange,提问作者suad alshammri
相关产品推荐
相关产品推荐

