3 回答
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));
}
}
}
添加回答
举报