我是 Firebase 和 NoSQL 的新手。我有一个 Android 演示,带有一个城市自动完成文本字段,我想在其中填充我从 Firebase 数据库中输入的城市。
{ "cities":{
"Guayaquil":true,
"Gualaceo":true,
"Quito":true,
"Quevedo":true,
"Cuenca":true,
"Loja":true,
"Ibarra":true,
"Manta":true
}
}
这就是我目前所拥有的。
如何从数据库中检索以字母开头的城市(从键盘输入)?如果我开始输入“G”,我想收到“Guayaquil”和“Gualaceo”。
如果我使用 orderByValue
总是返回一个空的快照。
如果我使用 orderByKey
返回整个列表。
Query citiesQuery = databaseRef.child("cities").startAt(input).orderByValue();
citiesQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<String> cities = new ArrayList<String>();
for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
cities.add(postSnapshot.getValue().toString());
}
注意:如果能推荐更好的数据结构,不客气。
最佳答案
@NicholasChen 发现了这个问题。但这是您使用 3.x SDK 实现的方式:
DatabaseReference cities = databaseRef.child("cities")
Query citiesQuery = cities.orderByKey().startAt(input).endAt(input+"\uf8ff");
citiesQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<String> cities = new ArrayList<String>();
for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
cities.add(postSnapshot.getValue().toString());
}
通过从用户输入开始到以用户输入开头的最后一个字符串结束,您将获得所有匹配项
对于相对较短的项目列表,Ryan 的方法也很有效。但是上面的 Firebase 查询将过滤服务器端。
更新
我刚刚运行了这段代码:
DatabaseReference databaseRef = FirebaseDatabase.getInstance().getReference("39714936");
String input = "G";
DatabaseReference cities = databaseRef.child("cities");
Query citiesQuery = cities.orderByKey().startAt(input).endAt(input + "\uf8ff");
citiesQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<String> cities = new ArrayList<String>();
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
cities.add(postSnapshot.getValue().toString());
}
System.out.println(cities);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
它打印了:
true
true
如此清楚地匹配两个城市。
关于android - 在 Android 中从 Firebase 实时数据库中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39714936/