从Android中的Firebase实时数据库中检索数据

Eri*_*ina 7 android nosql firebase firebase-realtime-database

我是Firebase和NoSQL的新手.我有一个Android演示,有一个城市自动填充文本字段,我想在输入时填充我的Firebase数据库中的城市.

{   "cities":{
        "Guayaquil":true,
        "Gualaceo":true,
        "Quito":true,
        "Quevedo":true,
        "Cuenca":true,
        "Loja":true,
        "Ibarra":true,
        "Manta":true
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我到目前为止所拥有的.

如何从以字母开头的数据库城市(键盘输入)中检索?如果我开始输入"G",我想收到"Guayaquil"和"Gualaceo".

如果我使用orderByValuealways总是返回一个空快照.

如果我使用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());
            }
Run Code Online (Sandbox Code Playgroud)

注意:如果您可以推荐更好的数据结构,欢迎您.

Fra*_*len 9

@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());
        }
Run Code Online (Sandbox Code Playgroud)

通过从用户输入开始并以用户输入开头的最后一个字符串结束,您将获得所有匹配的项目

对于相对较短的项目列表,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) {

        }
    });
Run Code Online (Sandbox Code Playgroud)

并打印:

真正

真正

所以清楚地匹配两个城市.

随意测试我的数据库:https://stackoverflow.firebaseio.com/39714936