如何在Android中使用startAt(double value,String key)和endAt(double value,String key)Firebase RealTime数据库

时间:2017-08-11 01:19:11

标签: android firebase firebase-realtime-database

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

当密钥包含数字时,我的问题出现了,如果密钥只有字母,那么就没有问题了。因为我直接从一个火焰激光器中读到了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

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

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

1 个答案:

答案 0 :(得分:0)

您似乎认为将两个参数传递给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"
},

另见: