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

时间:2019-01-12 00:01:08

标签: 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) {

        }
    });
}

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

如果有人能帮助我理解为什么此搜索查询无法正常工作,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

Firebase中的查询确实对大写字母敏感。试试这个。

private void firebaseEventSearch(String name) {
    //query to search database based on text in textbox - made case insensitive
    //Add this part
    String firstLetterCapital = query.substring(0, 1).toUpperCase() + query.substring(1);
    Query eventSearchQuery = eventRef.orderByChild("name").startAt(firstLetterCapital).endAt(firstLetterCapital + "\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) {

        }
    });
}

答案 1 :(得分:3)

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

A B C .... X Y Z a b c ... x y z

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

A B C .... X Y Z a

这比您想要的更多。

如果要允许在Firebase上进行大小写无关的搜索,最常见(但并非完全故障安全)的实现方法是添加一个额外的属性,以不区分大小写的方式存储名称。例如。 "name_uppercase": "ZUHRAIN"。有了它,您可以搜索:

eventRef.orderByChild("name_uppercase").startAt(name.toUpperCase()).endAt(name.toUpperCase() + "\uf8ff");

另请参阅: