Java Android:Firebase搜索查询无法正常工作
我对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
它在大多数情况下运行良好,但是,当我输入字母“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,但它显示了一种更安全的方法)
事件
来自哪里吗?“事件”是一个数组列表,每个数据库项都被添加到其中<代码>列表事件=新建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");