当前位置: 首页 > 知识库问答 >
问题:

如何在android中查询Firestore并获取特定文档

段干瑞
2023-03-14

我在使用firestore查询“wherequalto”时遇到了麻烦。我试图从一个名为“参与者”的集合中获取图像,但当文档不存在时,应该使用else语句并移动到更新文档的下一个活动。但是在onComplete侦听器(即任务)中从集合中查询文档时,文档没有退出,而是代码运行到if(Task.issucessful){}中,并且没有使用else语句。我的代码:有谁能帮我吗?谢谢

 //***********BattlePost1**************

        mFirestore.collection("OpenBattle")
                .document(battlesPost_creator)
                .collection("BattlePost")
                .document(battlePost_id)
                .collection("Participants")
                .document(UserId)
                .collection("Posts").whereEqualTo("battle_post_count", 1)
                .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()){
                    for (QueryDocumentSnapshot document : task.getResult()){
                        Glide.with(mContext).load(document.get("imageuri")).into(battle_creator_postImage1);
                        battle_points1.setText(String.valueOf(document.get("numberOfLikesPoints")) + "Points");
                    }

                }else {
                    Log.d(TAG, "onComplete: Error getting the first document");
                }
            }
        });

        //**************BattlePost2***************

        mFirestore.collection("OpenBattle")
                .document(battlesPost_creator)
                .collection("BattlePost")
                .document(battlePost_id)
                .collection("Participants")
                .document(UserId)
                .collection("Posts")
                .whereEqualTo("battle_post_count", 2)
                .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        Log.d(TAG, document.getId() + " => " + document.getData());
                        Glide.with(mContext).load(document.get("imageuri")).into(battle_creator_postImage2);
                        battle_points2.setText(String.valueOf(document.get("numberOfLikesPoints")) + "Points");
                    }
                } else {
                    Log.d(TAG, "Error getting documents: ", task.getException());
                    //Can create a 2nd post
                    Glide.with(mContext).load(R.drawable.ic_add_circle_black_24dp).into(battle_creator_postImage2);
                    battle_creator_postImage2.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            Intent intent = new Intent(mContext, TemplateActivity.class);
                            intent.putExtra(getString(R.string.battle_add_post),battlePost_id);
                            intent.putExtra("BattlePost_Pub", battlesPost_creator);
                            intent.putExtra("Battle_contest", 2);
                            intent.putExtra("Battle_tittle", battle_tittle);
                            intent.putExtra("Battle_timeEnd", battle_timeEnd);
                            startActivity(intent);
                        }
                    });
                }
            }
        });

共有1个答案

蒯宇定
2023-03-14

即使找不到文档,task.issucesful()也会返回true,因为它已经完成了查询的任务,并且发现不存在这样的文档。因此,您应该检查文档是否存在。从文档中看一下-

DocumentReference docRef = db.collection("cities").document("SF");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            //See the part below.
            if (document.exists()) {
                Log.d(TAG, "DocumentSnapshot data: " + document.getData());
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    }
});

您将必须编写另一个else语句,并将用于更新文档的代码放入其中。

 类似资料:
  • 如何从拥有数千个文档的Firestore集合中有效地获得整个查询大小? 在我的例子中,我通过几种不同的规则查询文档: 开始日期 结束日期 位置ID 关键字 我可以使用云函数进行与前面相同的查询,但没有限制,然后得到它的大小,但有没有更有效的方法做到这一点?查询大小可能是数千个文档,那么这样做是否存在性能问题?在这种情况下,帐单是如何工作的? 如果。我的查询是1500个文档,是否需要1500个读取操

  • 假设我有一个评论集。每个comment对象都有一个指向发帖用户的“doc ref”。我需要一个查询,它将返回一个注释列表,包括每个单个用户引用的值,因此我的查询返回一个很好的格式的Json注释对象。

  • 我希望在我的社交应用程序中实现朋友搜索功能。为此,我尝试在DB的“用户”集合中查询每个用户的文档,但它应该排除一些特定文档,例如当前用户已经是朋友的用户或请求待定的用户。 是否可以通过在Firestore中传递这些文档引用ID来查询所有用户文档,不包括特定文档。 如果没有,有人能说一种结构化数据的方法,以便我可以实现这个功能吗?谢谢。

  • 我有一个云Firestore DB,其结构如下: null null 有人能想出一个优雅的解决这个问题的办法吗?

  • 问题内容: 对于我的应用程序而言,至关重要的是能够从Firebase的集合中随机选择多个文档。 由于Firebase(我知道)没有内置本机函数来实现执行此操作的查询,因此我的第一个想法是使用查询游标选择随机的起始索引和终止索引,前提是我拥有​​其中的文档数集合。 这种方法行之有效,但只能以有限的方式进行,因为每次每次文档都会与其相邻文档一起依次送达。但是,如果我能够通过其父集合中的索引选择一个文档