我有一组用户,我想从数据库中查询所有用户,并将它们显示在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 } });