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

Android应用中Firestore的whereEqualTo()查询行为异常问题

异常原因
  • task.isSuccessful() 仅用于判断Firestore查询请求本身是否正常执行完成,只要没有出现权限错误、网络异常、参数非法等问题,该返回值就为true,和是否查询到匹配文档没有关联。当前你没有对查询返回的结果集做非空判断,只要请求不报错就会显示"User found",和实际匹配结果无关。
  • 你当前所有songs集合文档的email字段均为空字符串,只要当前登录用户的邮箱不为空,查询本身不会返回任何匹配文档,但因为缺少结果集空校验逻辑,仍会走成功展示分支。
解决方法

在请求成功的分支中增加QuerySnapshot的空校验逻辑,判断是否存在匹配的文档,同时可补充登录状态判空避免空指针异常,修正后的代码如下:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_registration);
    firebaseAuth = FirebaseAuth.getInstance();
    FirebaseFirestore db = FirebaseFirestore.getInstance();
    TextView userinfo = (TextView)findViewById(R.id.link);
    FirebaseUser userauth = firebaseAuth.getCurrentUser();
    // 增加用户登录状态判空,避免空指针异常
    if (userauth == null) {
        userinfo.setText("User not logged in");
        return;
    }
    db.collection("songs").whereEqualTo("email",userauth.getEmail()).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>(){
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                QuerySnapshot snapshot = task.getResult();
                // 校验返回结果是否为空
                if (!snapshot.isEmpty()) {
                    userinfo.setText("User found");
                } else {
                    userinfo.setText("User not found");
                }
            } else {
                // 排查问题时可打印异常日志:Log.e("FirestoreQuery", "Error: ", task.getException());
                userinfo.setText("User not found");
            }
        }
    });
}

内容的提问来源于stack exchange,提问作者user16931025

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:36:04