Android 如何根据字段的值仅查询firestore collectiongroup中的某些文档?

Android 如何根据字段的值仅查询firestore collectiongroup中的某些文档?,android,database,google-cloud-firestore,Android,Database,Google Cloud Firestore,所以,我有一个firestore数据库,它存储了我的用户和他们的帖子。帖子有一个布尔“可用”字段,我想用它来选择哪些帖子将出现在我的仪表板上。 我使用collectionGroup来查询所有帖子,但当尝试使用.whereEqualTo(“available”、“true”)检查“available”字段是否为“true”或“false”时,我的应用程序会运行,但仪表板不会加载任何帖子,并显示一个祝酒词,上面写着“找不到文档”。 这是我的代码: private void homePost

所以,我有一个firestore数据库,它存储了我的用户和他们的帖子。帖子有一个布尔“可用”字段,我想用它来选择哪些帖子将出现在我的仪表板上。 我使用collectionGroup来查询所有帖子,但当尝试使用.whereEqualTo(“available”、“true”)检查“available”字段是否为“true”或“false”时,我的应用程序会运行,但仪表板不会加载任何帖子,并显示一个祝酒词,上面写着“找不到文档”。 这是我的代码:


    private void homePostsRetriever(Context context) {
        String userId = FirebaseAuth.getInstance().getCurrentUser() != null ? FirebaseAuth.getInstance().getCurrentUser().getUid() : null;

        if (userId == null || userId.isEmpty()) {
            Toast.makeText(context, "No user id", Toast.LENGTH_SHORT).show();
            return;
        }

        FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
        rootRef.collectionGroup("posts").whereEqualTo("available", "true").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot documentSnapshots) {
                for (DocumentSnapshot documentSnapshot : documentSnapshots.getDocuments()) {
                    Post post = new Post();
                    post.setTitle(documentSnapshot.getString("title"));
                    post.setDescription(documentSnapshot.getString("description"));
                    
                    list.add(post);
                }
                notifyDataSetChanged();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(context, "No document found", Toast.LENGTH_SHORT).show();
            }
        });
    }
我使用.whereEqualTo(“available”,true)将代码从“true”更改为true,但得到了相同的结果。没有后置加载


该字段的类型必须在客户端和服务器之间匹配。这里没有足够的信息可以确定(屏幕截图会更好),但您的查询要求文档的“available”字段设置为确切的字符串“true”。请注意,它要求的是字符串,而不是布尔值。如果文档实际上包含布尔字段值,则查询将找不到它们,因为类型不匹配

如果文档字段“availalble”实际上包含布尔值而不是字符串,则应向查询传递布尔值,而不是如下所示的字符串:

whereEqualTo("available", true)
不像您现在这样,使用字符串值:

whereEqualTo("available", "true")  // the quotes around "true" make it a string

如果看不到相关收藏的确切内容,我们在这方面就帮不了什么忙。@DougStevenson希望这足够清楚。谢谢你的建议,这很有道理,但似乎这并不能解决问题。那么,如果你按照我的建议更新代码,你的代码会做什么呢?顺便说一下,onFailureListener并不意味着您的查询没有返回任何结果。这表明查询是否完全失败,您应该检查异常以找出错误所在。添加新的img代码只是为了澄清。诚恳地说,在这里发布之前,我已经多次尝试使用true和not'true。请再次阅读我最后的评论并回答问题。我要求您在从调试器或调试日志中观察代码时,解释代码实际在做什么。我不确定我是否理解您希望我提供的信息。我的意思是,我刚刚学会了使用调试器,我在这些代码行中使用了调试器,但没有得到任何提示。
whereEqualTo("available", "true")  // the quotes around "true" make it a string