我有一个用户集合,我想查询数据库中的所有用户,并将它们显示在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
}
}
});
}
}
});
第二种方法要短得多,因为我使用的是这样的方法:
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
}
});