微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从Firestore查询中排除元素?

我有一组用户,我想从数据库查询所有用户,并将它们显示在RecyclerView中,除了我的一个.这是我的数据库架构:
users [collection]
  - uid [document]
     - uid: "fR5bih7SysccRu2Gu9990TeSSyg2"
     - username: "John"
     - age: 22
  - //other users

如何查询数据库如下:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
Query q = db.collection("users").whereNotEqualTo("uid",uid);

因此,我需要将此查询对象传递给FirestoreRecyclerOptions对象,以便在RecyclerView中显示所有其他用户.

这甚至可能吗?如果没有,我该如何解决?谢谢!

编辑:

options = new FirestoreRecyclerOptions.Builder<usermodel>()
        .setQuery(query,new SnapshotParser<usermodel>() {
            @NonNull
            @Override
            public usermodel parseSnapshot(@NonNull DocumentSnapshot snapshot) {
                usermodel usermodel = documentSnapshot.toObject(usermodel.class);
                if (!usermodel.getUid().equals(uid)) {
                    return usermodel;
                } else {
                    return new usermodel();
                }
            }
        }).build();

解决方法

经过几天和几天的努力,我终于找到了答案.没有@Raj的帮助,我无法解决这个问题.非常感谢@Raj的耐心和指导.

首先,根据@Frank van Puffelen在post的回答中提供的答案,我停止寻找可以帮助我将两个查询传递给单个适配器的解决方案.

在这个问题中,我想要实现的只是查询数据库以获得除了一个以外的所有用户,我.因为我们不能将两个查询组合到一个实例中,我发现我们可以组合两个查询的结果.所以我创建了两个查询

FirebaseFirestore db = FirebaseFirestore.getInstance();
Query firstQuery = db.collection("users").whereLessthan("uid",uid);
Query secondQuery = db.collection("users").whereGreaterThan("uid",uid);

我的用户对象有一个usermodel(POJO)类.我发现不是一个,而是两种解决问题的方法.第一个查询数据库获取与第一个条件对应的所有用户对象并将它们添加到列表中.之后,再次查询数据库获取与第二个条件对应的其他用户对象,并将它们添加到同一列表中.现在我有一个列表,其中包含我需要的所有用户,但其中一个查询中具有该特定ID的用户.这是未来访问者的代码

firstQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        List<usermodel> list = new ArrayList<>();
        if (task.isSuccessful()) {
            for (DocumentSnapshot document : task.getResult()) {
                usermodel usermodel = document.toObject(usermodel.class);
                list.add(usermodel);
            }

            secondQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (DocumentSnapshot document : task.getResult()) {
                            usermodel usermodel = document.toObject(usermodel.class);
                            list.add(usermodel);
                        }

                        //Use the list of users
                    }
                }
            });
        }
    }
});

第二种方法会短得多,因为我使用Tasks.whenAllSuccess(),如下所示:

Task firstTask = firstQuery.get();
Task secondTask = secondQuery.get();

Task combinedTask = Tasks.whenAllSuccess(firstTask,secondTask).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
        @Override
        public void onSuccess(List<Object> list) {
            //This is the list that I wanted
        }
});

原文地址:https://www.jb51.cc/android/314049.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐