【问题标题】:Firebase Android - startAt() and endAt() not working correctly?Firebase Android - startAt() 和 endAt() 无法正常工作?
【发布时间】:2017-07-17 07:35:13
【问题描述】:

如何根据用户名搜索用户?我已经查看了很多关于这个问题的 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

【问题讨论】:

  • 你在用什么queryText?如果你使用.equalTo("fakeuser3") 而不是startAt()endAt() 会发生什么?
  • queryText 是从“搜索栏”输入的文本。尝试 .equalsTo() 再次返回所有用户 :( 我开始怀疑我是否使用了正确的监听器..
  • 宾果游戏!看我的回答。

标签: android firebase firebase-realtime-database


【解决方案1】:

您几乎做对了,但您应该在已经应用 orderBy()startAt()endAt() 的数据库引用之后添加 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());
                }
            });

【讨论】:

  • 天哪,谢谢!如果我分别执行 userRef.orderby().startAt().endAt() 和 userRef.AddListener 为什么会有所不同?
  • 通过应用orderBy()startAt()endAt(),它不会改变userRef,但它会返回Query对象的实例。查看 Firebase 文档了解更多详情:)
【解决方案2】:

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

但是addListener方法必须直接应用于orderByChild()startAt()endAt()方法链返回的对象,而不是在使用@987654331检索的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) {}
    });

【讨论】:

  • 感谢您的回复!让我试试这个(:
  • 好的,我已经更改了侦听器并在搜索栏中输入 f 确实使 queryText = "f" 但日志仍然打印出数据库中的所有用户 :( 并且五个用户中只有 3 个有以 f 开头的用户名 :(
  • 是的,很清楚,orderByChild() 等没有像 Boonya Kitpitak 的回答中指出的那样产生任何影响。您将addListenerForSingleValueEvent() 直接应用于getReference("users") 返回的DatabaseReference。乍一看,我忽略了这一点。
猜你喜欢
  • 1970-01-01
  • 2020-04-09
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 2021-10-16
相关资源
最近更新 更多