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
相关产品推荐
相关产品推荐

