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

