【问题标题】:Check if a field exists - search through Firestore database检查字段是否存在 - 通过 Firestore 数据库搜索
【发布时间】:2020-07-15 21:12:13
【问题描述】:

我正在为学校做一个项目 - android 应用程序,它在检查 Firestore 的不同数据库中是否有相应的卡号和电话号码后将用户注册到实时数据库。目前它只验证第一个文档,但如果我在其他文档中搜索它们,它不会找到这些字段。

这是我使用的方法:

    public void checkIfCardExists() {
    Query query = cardInfo.whereEqualTo("CardNo", cardNumber)
            .whereEqualTo("Phone", userPhone);

    query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    boolean documentExists;

                    if (task.isSuccessful()) {
                            Log.d("QueryResult", "Is query result empty: " + task.getResult().isEmpty());
                            documentExists = !task.getResult().isEmpty();

                    }else {
                        Log.e("QueryResult", "Error getting documents.", task.getException());
                        documentExists = false;
                    }

                    if(documentExists) {
                        Log.d("QueryResult", "The document exists");
                        Toast.makeText(com.example.transportticket.RegistrationLeap.this, "Card number found",
                                Toast.LENGTH_SHORT).show();
                        userLeap = new UserLeap(userEmail, userPass, userName, userSurname, cardNumber, userPhone);
                        registerUserLeap(userEmail, userPass);
                        startActivity(new Intent(RegistrationLeap.this, Empty.class));


                    }else{
                        Log.d("QueryResult", "The document doesn't exist or there was an error retrieving it");
                        Toast.makeText(com.example.transportticket.RegistrationLeap.this, "Card number not found",
                                Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(RegistrationLeap.this, Empty.class));
                    }
                }
            });
}

这就是我的 Firestore 数据库的样子 Firestore database

I added a photo to clarify about finding the first document

【问题讨论】:

  • “如果我在其他文档中搜索这些字段,将找不到这些字段”是什么意思?这段代码中究竟有什么不符合您的预期?
  • 我的意思是,如果我输入位于第一个文档中的卡号和电话号码,它会找到它并继续输入代码。但如果它们位于其他地方,它将找不到,m 并且不会注册用户
  • 我的意思是,如果我输入位于第一个文档中的卡号和电话号码,它会找到并继续输入代码。 这是正确的行为。 “位于其他地方”是什么意思?
  • 我又添加了一张照片。将找到顶部文档,但不会找到其余文档。如何搜索所有文档?
  • 其他文档中的值与第一个相同吗?

标签: android google-cloud-firestore


【解决方案1】:

如果您使用以下代码行:

Query query = cardInfo.whereEqualTo("CardNo", cardNumber)
        .whereEqualTo("Phone", userPhone);

这意味着您要告诉 Firestore 返回 CardNo 属性包含 cardNumber 值的所有文档 AND Phone 属性包含 userPhone 值。因此,如果您的集合中只有一个文档满足此约束,则将返回一个文档。结果中将不存在其他文档。你现在做的,叫做过滤。但是,如果您想获取所有文档,那么您应该删除两个 whereEqualTo() 调用或直接使用 cardInfo 这是一个 CollectionReference 对象。这样,您就不会过滤任何内容。 CollectionReference 对象基本上是一个没有任何过滤器的Query

所以使用最后一个解决方案,您可以获得所有文档,还可以在客户端上创建过滤。这不是推荐的方法,因为获取所有文档的成本非常高。例如,如果您的集合中有 1000 个文档,则需要支付 1000 次读取操作才能拥有它们。因此,由您决定哪一个更适合您。

【讨论】:

  • 我只需要一份文件。但问题是我的应用程序除了第一个文档之外什么也找不到。如果我从第二个或第三个文档中输入值,它将返回“不存在”并将流向错误的方向
  • 在这种情况下,这意味着您传递给.whereEqualTo() 的值与您在数据库中的值匹配。尝试使用硬编码值,这样可以吗?
  • 确实不同的值,我尝试将字符串与数字进行比较。史诗般的失败)谢谢你的回答,它有帮助!
  • 很高兴听到有帮助 ;)
猜你喜欢
  • 2019-02-19
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 2021-11-14
  • 1970-01-01
相关资源
最近更新 更多