我要做的就是创建一个名为users的数据库具有属性username. 我在一个列表中有一些用户名,我想显示这些用户的详细信息,只有其用户名出现在列表中。如何编写查询来获取仅在此列表中找到其用户名的用户的详细信息?注意这里没有字典顺序,所以我不能同时使用startAt()
和endAt()
函数。
代码片段:
=比;myList包含用户名。
这段代码不能产生准确的结果。任何帮助都将非常感激!谢谢你!
FirebaseRecyclerOptions<MainModel> options =
new FirebaseRecyclerOptions.Builder<MainModel>()
.setQuery(FirebaseDatabase.getInstance().getReference().child("users").orderByChild("username")
.startAt(myList.get(0)).endAt(myList.get(myList.size()-1)),MainModel.class).build();
正如在评论中已经提到的,Firebase-UI库对您的情况没有帮助,因为它不允许您将多个查询传递给FirebaseRecyclerOptions对象。因此,您需要执行单独的查询并使用合并后的结果。
当你在Firebase实时数据库查询对象上调用.get()
时,你正在返回一个任务对象。所以解决这个问题的关键是使用whenAllSuccess(Collection>任务)。在您的示例中,它应该像这样:
DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = db.child("users");
Query query = usersRef.orderByChild("username");
List<Task<DataSnapshot>> tasks = new ArrayList<>();
for (String username : myList) {
tasks.add(query.equalTo(username).get());
}
Tasks.whenAllSuccess(tasks).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
@Override
public void onSuccess(List<Object> list) {
//Do what you need to do with your list.
for (Object object : list) {
MainModel mm = ((DataSnapshot) object).getValue(MainModel.class);
if(mm != null) {
Log.d("TAG", mm.getUsername());
}
}
}
});
假设您在MainModel
类中有一个名为getUsername()
的getter,那么您的logcat中的结果将是所有返回子节点的所有用户名。