我是Firebase和NoSQL的新手。我有一个Android演示,带有“城市自动完成”文本字段,我想在键入时在其中填充Firebase数据库中的城市。
{ "cities":{
"Guayaquil":true,
"Gualaceo":true,
"Quito":true,
"Quevedo":true,
"Cuenca":true,
"Loja":true,
"Ibarra":true,
"Manta":true
}
}
到目前为止,这就是我所拥有的。
如何从以字母开头(从键盘输入)开始的DB城市中检索?如果我开始输入“ G”,我希望收到“瓜亚基尔”和“瓜拉索”。
如果我使用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) {
}
});
它打印:
真正
真正
显然可以匹配两个城市。
随时针对我的数据库进行测试:https : //stackoverflow.firebaseio.com/39714936
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句