【问题标题】:How to use startAt(double value, String key) and endAt(double value, String key) Firebase RealTime Database in Android如何在 Android 中使用 startAt(double value, String key) 和 endAt(double value, String key) Firebase RealTime Database
【发布时间】:2017-08-11 01:19:11
【问题描述】:

我想使用orderByChild 进行查询,并使用这些孩子的密钥进行过滤。在这种情况下,我的键和值都是用于查询我想要的数据。

当键包含数字时会出现我的问题,如果键只有字母,那么没有问题。自从我直接从 firebaser 阅读 another answer 中的建议以来,我一直在尝试保持数字中的字母。

我的json是:

{
  "my_list":{
    "100xyz":{
      "value1": 100,
      "value2": 100,
      "name":"100xyz"
    },
    "200xyz":{
      "value1": 200,
      "value2": 200,
      "name":"200xyz"
    },
    "300xyz":{
      "value1": 300,
      "value2": 300,
      "name":"300xyz"
    },
    "400xyz":{
      "value1": 400,
      "value2": 400,
      "name":"400xyz"
    },
    "500xyz":{
      "value1": 500,
      "value2": 500,
      "name":"500xyz"
    }
  }
}

我的代码是:

DatabaseReference root = FirebaseDatabase.getInstance().getReference().getRoot();
DatabaseReference list = root.child("my_list");
list.orderByChild("value2").startAt(100, "100xyz").endAt(500, "200xyz").addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        SomeModel someModel = dataSnapshot.getValue(SomeModel.class);
        Log.d("SOME_MODEL", someModel.getName());
    }
});

问题是我可以在控制台中看到 4 个孩子:

D/SOME_MODEL: 100xyz
D/SOME_MODEL: 200xyz
D/SOME_MODEL: 300xyz
D/SOME_MODEL: 400xyz

但我应该只被看到 2

D/SOME_MODEL: 100xyz
D/SOME_MODEL: 200xyz

我想强调:只要键没有数字,它确实有效。

当key有数字时,如何同时按orderByChild和key过滤?

【问题讨论】:

  • 因为我很可能是回答您所说的问题的 Firebaser(当您提到另一个问题时,总是感谢链接),我很乐意提供帮助。您能否将您的问题简化为单个 JSON,并使用一个相应的代码示例重现该问题?
  • @FrankvanPuffelen 抱歉跳过链接,我从昨天开始尝试解决这个问题,现在有点累了。我已经应用了您建议的版本。请让我知道我是否可以做任何其他事情来改善我的问题。
  • 你为什么不使用startAt(String value, String key)?你认为double 值是什么意思?
  • @cricket_007 因为我的“value2”是双精度的,所以最好这样查找。为了给你更多的背景信息,我正在尝试做类似 GeoFire 的事情,“value1”是我的纬度,“value2”是我的经度,关键是两者的组合。这样我可以 orderByChild("longitude"),但只能在一个纬度范围内(关键)。你认为问题是双重的吗?因为只有当键有数字时才会出现问题。

标签: android firebase firebase-realtime-database


【解决方案1】:

您似乎认为将两个参数传递给endAt() 会使查询在值或键中的任何一个先出现时结束。这不是 Firebase 中查询的工作方式。

endAt() 的第二个参数仅在查询找到与第一个参数匹配的节点后使用。

因此,当您传递endAt(500, "200xyz") 时,数据库首先过滤value2 等于value2(第一个参数)的节点。这意味着它找到这个节点作为查询的结尾:

"500xyz":{
  "value1": 500,
  "value2": 500,
  "name":"500xyz"
}

然后它使用键200xyz(第二个参数)来确定是否包含此节点(技术上:在多个节点列表中结束返回的位置)。由于键 200xyz500xyz 之前,因此查询结果不包括该节点,导致:

"100xyz":{
  "value1": 100,
  "value2": 100,
  "name":"100xyz"
},
"200xyz":{
  "value1": 200,
  "value2": 200,
  "name":"200xyz"
},
"300xyz":{
  "value1": 300,
  "value2": 300,
  "name":"300xyz"
},
"400xyz":{
  "value1": 400,
  "value2": 400,
  "name":"400xyz"
},

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 2021-12-16
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    相关资源
    最近更新 更多