在 firebase 实时数据库中搜索用户名

Searching for username in firebase realtime database

提问人:Harsh Master 提问时间:11/11/2023 最后编辑:Frank van PuffelenHarsh Master 更新时间:11/11/2023 访问量:37

问:

我正在构建一个集成 firebase 的 android 应用程序,我希望有一个功能,用户可以使用他们的姓名/用户名搜索其他用户。我目前正在使用 SearchView 小部件(想使用 onQueryTextChange()) 例如,如果用户键入代码,则会显示所有匹配“code”(或以“code”开头,其中任何一个)的查询

Firebase 结构:

users
    <uid of user1>
            name: ....
            username: .......
    <uid of user2>
            name: ....
            username: .......
    ...
    ...

帮助我提供省时的解决方案(在 java 中),以便搜索速度很快

java android firebase firebase-realtime-database

评论


答:

1赞 Frank van Puffelen 11/11/2023 #1

在您拥有的结构中,如果只想检索其属性值为 的子节点,则可以使用查询对节点进行排序和筛选。像这样的东西:usersusername"code"

Query query = dbRoot.child("users").orderByChild("username").equalTo("code");

若要执行查询,请执行以下操作:

query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
            Log.i("DB", userSnapshot.getKey());
            Log.i("DB", userSnapshot.child("name").getValue(String.class));
            ...
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
}

如果要获取以 开头的所有子节点,则为:username"code"

Query query = dbRoot.child("users")
  .orderByChild("username")
  .startAt("code")
  .endAt("code~");

评论

0赞 Harsh Master 11/12/2023
.endAt(“code~”)的意义是什么;
1赞 Frank van Puffelen 11/12/2023
它只是 ASCII 字符范围中后期的一个字符,因此查询会捕获通常位于该范围内的所有节点。