android - 在 Android 中从 Firebase 实时数据库中检索数据

标签 android firebase firebase-realtime-database nosql

我是 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

如此清楚地匹配两个城市。

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

关于android - 在 Android 中从 Firebase 实时数据库中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39714936/

相关文章:

Android ViewPager 维度

java - 如果用户不验证电子邮件,会发生什么?

javascript - 尝试添加到状态数组抛出 Cannot read property 'setState' of null

android - 制作 "slide from bottom"按钮(类似于snackbar)(Android)

java - 如何在 Android 上获取有关显示设备的 PCI 信息

firebase - 谷歌分析数据的可靠性

c# - 如何在 Unity 中使用 Gradle

javascript - Firebase数据结构思想

android - 更新多个 Firebase 节点

android - Android Studio仅在选择“生成APK”时签名APK,而在单击“运行”按钮时不签名