首页 文章

Firebase Android - startAt()和endAt()无法正常工作?

提问于
浏览
1

如何根据用户名搜索用户?我已经看过很多关于此事的SO帖子,但我仍然无法实现我想做的事情 . 我试图应用我在这些帖子中看到的内容,如下所示:

DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("users");
            usersRef.orderByChild("username")
                    .startAt(queryText)
                    .endAt(queryText+"\uf8ff");

            usersRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {
                    searchList = new ArrayList<>();
                    for (DataSnapshot postSnapshot: snapshot.getChildren()) {
                        User user = postSnapshot.getValue(User.class);
                        Log.d("USER: ", "" + user.getUsername());

                        searchList.add(user);
                    }

                    adapter = new UserCardAdapter(getContext(), searchList);
                    recyclerView.setAdapter(adapter);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.e("onQueryTextChange: " ,databaseError.getMessage());
                }
            });

但是,仍然会检索所有用户 . 我已经看到startAt()和endAt()的用法据说可以在其他帖子上为其他人工作,但我无法让它为我工作..

这是用户数据的存储方式:User Data Structure

2 回答

  • 0

    你差不多完成了,但是你应该在已经应用 orderBy()startAt() ,_ 1876300之类的数据库引用之后添加 addListenerForSingleValueEvent .

    usersRef.orderByChild("username")
                            .startAt(queryText)
                            .endAt(queryText+"\uf8ff")
                            .addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot snapshot) {
                        searchList = new ArrayList<>();
                        for (DataSnapshot postSnapshot: snapshot.getChildren()) {
                            User user = postSnapshot.getValue(User.class);
                            Log.d("USER: ", "" + user.getUsername());
    
                            searchList.add(user);
                        }
    
                        adapter = new UserCardAdapter(getContext(), searchList);
                        recyclerView.setAdapter(adapter);
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        Log.e("onQueryTextChange: " ,databaseError.getMessage());
                    }
                });
    
  • 2

    根据documentation,您对 orderBy()startAt()endAt() 的使用是正确的 .

    但是 addListener 方法必须直接应用于 orderByChild()startAt()endAt() 方法链返回的对象,而不是应用 ... .getReference("users") 检索到的 DatabaseReference 上的新语句 .

    如果您使用ChildEventListener

    DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("users");
    usersRef.orderByChild("username")
            .startAt(queryText)
            .endAt(queryText+"\uf8ff");
            .addChildEventListener(new ChildEventListener() {
              List<User> searchList = new ArrayList<>();
    
              @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                User user = dataSnapshot.getValue(User.class);
                Log.d("USER: ", "" + user.getUsername());
                searchList.add(user);
              }
    
              @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
              @Override public void onChildRemoved(DataSnapshot dataSnapshot) {}
              @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
              @Override public void onCancelled(DatabaseError databaseError) {}
        });
    

相关问题