Android:Firebase 搜索查询无法正常工作

min*_*ate 5 java android firebase firebase-realtime-database

我对 Android 应用程序开发相当陌生。我创建了一个简单的搜索查询,可以按名称搜索我的 firebase 数据库(请参阅下面的代码):

private void firebaseEventSearch(String name) {
    //query to search database based on text in textbox - made case insensitive
    Query eventSearchQuery = eventRef.orderByChild("name").startAt(name.toUpperCase()).endAt(name.toLowerCase() + "\uf8ff");
    eventSearchQuery.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
                Event event = eventSnapshot.getValue(Event.class);
                events.add(event);
            }
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

它在大多数情况下工作正常,但是,当我输入字母“A”或“B”时,它将显示所有数据库结果 - 搜索不适用于这两个字母。另外,如果我输入第一个字母与数据库条目匹配的搜索字符串,它将显示该数据库项目,即使字符串的其余部分与它不匹配。

如果有人能帮助我理解为什么这个搜索查询不能正常工作,我将非常感激。

Fra*_*len 3

Firebase 数据库查询区分大小写。因此,当您调用时,orderByChild("name")所有节点都按其name属性排序。如果您查看 ASCII 图表,您会发现这将导致小写和大写字符的顺序如下:

A B C .... X Y Z a b c ... x y z
Run Code Online (Sandbox Code Playgroud)

现在您的查询获取该数据的一部分。如果您正在搜索A,则切片为:

A B C .... X Y Z a
Run Code Online (Sandbox Code Playgroud)

所以这比你想要的要多得多。

如果您想在 Firebase 上允许不区分大小写的搜索,最常见(但不是完全安全)的实现方法是添加一个额外的属性,以不区分大小写的方式存储名称。例如"name_uppercase": "ZUHRAIN"。这样您就可以搜索:

eventRef.orderByChild("name_uppercase").startAt(name.toUpperCase()).endAt(name.toUpperCase() + "\uf8ff");
Run Code Online (Sandbox Code Playgroud)

另请参阅: