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

Java Android:Firebase搜索查询无法正常工作,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我对Android应用程序开发相当陌生。我创建了一个简单的搜索查询,可以按名称搜索我的firebase数据库(请参见下面的代码): 它在大多数情况下运行良好,但是,当我输入字母“A”或“B”时,它将显示所有数据库结果-搜索对这两个字母不起作用。此外,如果我键入第一个字母与数据库条目匹配的搜索字符串,它将显示此数据库项,即使字符串的其余部分与之不匹配 如果有人能帮助我理解为什么这个搜索查询不能正常工作,我将不胜感激。Firebase中的查询对大写字母非常敏感。试试这个 private void f

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


它在大多数情况下运行良好,但是,当我输入字母“A”或“B”时,它将显示所有数据库结果-搜索对这两个字母不起作用。此外,如果我键入第一个字母与数据库条目匹配的搜索字符串,它将显示此数据库项,即使字符串的其余部分与之不匹配


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

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) {

        }
    });
}

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\u大写”:“ZUHRAIN”
。有了它,您可以搜索:

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

  • (用于云Firestore,但它显示了一种更安全的方法)

非常感谢您的帮助!添加此项后,我的查询将不会返回仅匹配第一个字母的值。然而,我仍然有问题的字母“a”和“b”。。。有什么想法吗?@minikate我可以知道
事件
来自哪里吗?“事件”是一个数组列表,每个数据库项都被添加到其中<代码>列表事件=新建ArrayList()@minikate您在使用firebase回收器适配器吗?我在使用RecyclerView,然后使用此适配器:
EventAdapter adapter=new EventAdapter(此,R.layout.eventlist\u布局,事件)“此外,如果我键入第一个字母与数据库条目匹配的搜索字符串,它将显示此数据库项,即使字符串的其余部分与之不匹配。”该行为似乎与您实现的代码完全一致。您正在筛选以输入的搜索字符串开头的任何项目。如果需要不同的行为,则需要执行不同的查询。例如,您不是在寻找
eventRef.orderByChild(“name”).equalTo(name)
。嗨,弗兰克,谢谢您的回答。我的问题是,如果我的搜索字符串是“cu”,它仍然会显示以“co”或“ca”等开头的数据库结果,即使这在技术上与搜索字符串不匹配。你知道有没有办法解决这个问题吗?如果即使有我的答案,你仍然有问题,请将你的问题更新为:1)为
name
2)使用硬编码值,包括
eventRef
中的JSON(作为文本,无屏幕截图)。您可以通过单击溢出菜单中的“导出JSON”链接来实现这一点(⠇) 在您的.Sir上,是否可以为大写字母生成新的子级?例如:
.child(uid).child(“大写”).setValue(modelUserUpperCase)
是的,这实际上是我的答案所提倡的。
name_uppercase
是一个附加属性,它应该包含
name
@FrankvanPuffelen的所有大写值,但是如何显示查询?我的意思是现在我们可以像正常一样显示,没有大写。例如:
child(“用户”).orderByChild(“名称”)…
。那么,如何处理大写字母,因为它们都是子字母大写。对不起,我很难理解问题所在。您可以通过名称访问
name
name\u uppercase
属性。如果您在实现这些属性时遇到困难,请向。
eventRef.orderByChild("name_uppercase").startAt(name.toUpperCase()).endAt(name.toUpperCase() + "\uf8ff");