You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase按Uid获取指定用户数据失败问题排查

Firebase数据库查询后phone变量为空的问题解决

问题场景

用户添加信息时携带另一用户Uid,接收后与数据库中用户文件夹的Uid比对,匹配则获取手机号等数据,但调试发现phone变量为空,点击拨号按钮无法显示目标号码。


相关代码

用户模型类ShopUser

public class ShopUser {
    private String client_shop, numberphone_shop, ShopInfouid;
    
    public ShopUser(){
    }
    
    public ShopUser(String client_shop, String numberphone_shop, String shopInfouid) {
        this.client_shop = client_shop;
        this.numberphone_shop = numberphone_shop;
        this.ShopInfouid = shopInfouid;
    }
    
    public String getClient_shop() {
        return client_shop;
    }
    
    public void setClient_shop(String client_shop) {
        this.client_shop = client_shop;
    }
    
    public String getNumberphone_shop() {
        return numberphone_shop;
    }
    
    public void setNumberphone_shop(String numberphone_shop) {
        this.numberphone_shop = numberphone_shop;
    }
    
    public String getShopInfouid() {
        return ShopInfouid;
    }
    
    public void setShopInfouid(String shopInfouid) {
        ShopInfouid = shopInfouid;
    }
}

数据库查询代码

// UidShop为从其他Activity传递的Uid,ShopInfouid为数据库中的用户Uid
ShopInfoRef.orderByChild("ShopInfouid").equalTo(getIntent().getExtras().get("UidShop").toString())
        .addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if (snapshot.exists() && snapshot.getChildrenCount() > 0) {
                    phone = snapshot.getValue(ShopUser.class).getNumberphone_shop();
                } else {
                    Toast.makeText(OplataActivity.this, "无相关数据", Toast.LENGTH_SHORT).show();
                }
            }
            
            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });

初始化与拨号代码

private String phone;
ShopInfoRef = FirebaseDatabase.getInstance().getReference().child("shop");

// 拨号按钮点击事件
image_phone_shop.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent phoneIntent = new Intent(Intent.ACTION_DIAL);
        phoneIntent.setData(Uri.parse("tel:" + phone));
        startActivity(phoneIntent);
    }
});

问题原因及解决办法

1. 异步查询时序问题

Firebase数据库查询是异步操作,onDataChange会在查询完成后执行,但按钮点击事件可能在查询完成前触发,此时phone未被赋值,导致为空。

解决办法:
将拨号逻辑初始化放在onDataChange方法内,确保phone赋值后再绑定点击事件:

@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
    if (snapshot.exists() && snapshot.getChildrenCount() > 0) {
        phone = snapshot.getValue(ShopUser.class).getNumberphone_shop();
        // 查询成功后绑定拨号逻辑
        image_phone_shop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent phoneIntent = new Intent(Intent.ACTION_DIAL);
                phoneIntent.setData(Uri.parse("tel:" + phone));
                startActivity(phoneIntent);
            }
        });
    } else {
        Toast.makeText(OplataActivity.this, "无相关数据", Toast.LENGTH_SHORT).show();
        // 无数据时禁用按钮
        image_phone_shop.setEnabled(false);
    }
}

2. 数据快照解析错误

若数据库字段名与ShopUser类属性名不匹配(大小写、拼写差异),会导致解析失败,phone无法获取值。

解决办法:

  • 核对Firebase数据库shop节点下的字段名,确保与ShopUser类属性完全一致;
  • 若字段名不一致,使用@PropertyName注解映射:
@PropertyName("shopInfouid") // 匹配数据库实际字段名
private String ShopInfouid;

3. 查询条件不匹配

传递的UidShop值与数据库中ShopInfouid值不一致,导致查询结果为空。

解决办法:

  • 打印日志确认传递的UidShop:Log.d("UidCheck", "传递的UidShop: " + getIntent().getExtras().get("UidShop").toString());
  • 比对数据库中实际的ShopInfouid值,排查空格、大小写等匹配问题。

4. 数据库权限限制

Firebase数据库规则限制了读取权限,导致查询无法获取数据。

解决办法:
临时设置公开读取权限测试(测试完成后需调整为安全规则):

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

内容的提问来源于stack exchange,提问作者shestakovski.erchim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:25:19