作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一组用户,我想从数据库中查询所有用户并将它们显示在 RecyclerView
中,除了一个 mine。这是我的数据库架构:
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) 类。我发现不是一种,而是两种解决问题的方法。第一个是查询数据库以获取与第一个条件相对应的所有用户对象并将它们添加到列表中。之后,再次查询数据库,获取与第二个条件对应的其他用户对象,并将它们添加到 same 列表中。现在我有一个列表,其中包含我需要的所有用户,但只有一个,即具有来自查询的特定 id 的用户。这是 future 访问者的代码:
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
}
});
关于java - 如何从 Firestore 查询中排除元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51859652/
我是一名优秀的程序员,十分优秀!