为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红糖糍粑 2021-07-16 14:01:28
我有一组用户,我想从数据库中查询所有用户,并将它们显示在一个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();
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

根据firestore的官方文档:-


Cloud Firestore 不支持以下类型的查询:


带有 != 子句的查询。在这种情况下,您应该将查询拆分为大于查询和小于查询。例如,虽然查询子句 where("age", "!=", "30") 不受支持,但是可以通过组合两个查询得到相同的结果集,一个带有子句 where("age", "< ", "30") 和一个带有子句 where("age", ">", 30)。


如果您使用 FirestoreRecyclerAdapter,则 FirestoreRecyclerOptions 将使用 setQuery() 方法直接接受查询,因此不允许您执行客户端过滤。


如果您尝试在 onBindViewHolder() 中应用过滤器,同时设置可能导致回收器视图中为空项目的数据。为了解决该问题,请参考方法 2。


因此,您的问题的可能解决方案是在每个文档下的用户集合中创建一个整数字段。例如:-


users [collection]

  - uid [document]

     - uid: "fR5bih7SysccRu2Gu9990TeSSyg2"

     - username: "John"

     - age: 22

     - check: 100

在此,我创建了一个值为 100 的 'check' 变量。因此,将所有其他文档中的 'check' 值设置为小于 100。现在,您可以轻松地进行查询以查找带有 check<100 的文档:-


Query q = db.collection("users").whereLessThan("check", 100);

这将检索除您不想要的文档之外的所有文档。在设置数据时,您可以设置其他参数,跳过检查变量。


方法二(客户端过滤)


我们可以在 onBindViewHolder() 方法中应用检查,如果检索到的 uid 与当前用户 uid 匹配,则将 Recycler 视图的高度设置为 0dp。作为:-


视图用户适配器.java


public class ViewUserAdapter extends FirestoreRecyclerAdapter<User, ViewUserAdapter.ViewUserHolder>

{

    String uid;

    FirebaseAuth auth;


    public ViewUserAdapter(@NonNull FirestoreRecyclerOptions<User> options)

    {

        super(options);

        auth = FirebaseAuth.getInstance();

        uid = auth.getCurrentUser().getUid();

    }


    @Override

    protected void onBindViewHolder(@NonNull ViewUserHolder holder, int position, @NonNull User model)

    {

        DocumentSnapshot snapshot =  getSnapshots().getSnapshot(position);

        String id = snapshot.getId();


        if(uid.equals(id))

        {

            RecyclerView.LayoutParams param = (RecyclerView.LayoutParams)holder.itemView.getLayoutParams();

            param.height = 0;

            param.width = LinearLayout.LayoutParams.MATCH_PARENT;

            holder.itemView.setVisibility(View.VISIBLE);


        }

        else

        {

            holder.tvName.setText(model.name);

            holder.tvEmail.setText(model.email);

            holder.tvAge.setText(String.valueOf(model.age));

        }

    }

}


查看完整回答
反对 回复 2021-07-23
  • 3 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信