即使引用检索数据,Firebase查询也无法在Android上运行

时间:2017-01-10 13:20:18

标签: java android firebase firebase-realtime-database

我正在尝试过滤我的Firebase数据,我的数据集很复杂,但这是一个示例。我能够很好地检索数据,但我无法使用Firebase查询进一步过滤该数据。这是一个示例数据集:

enter image description here

这是我的问题:

private double locStart;
private double locEnd;
Firebase mRef;
Firebase mRef1;

    mRef = new Firebase("https://test.firebaseio.com/");
mRef1 = mRef.child("test");

    final Intent intent = getIntent();
    final Inputs inputs = (Inputs) intent.getSerializableExtra("inputs");

    locStart = inputs.getLocLat() - 0.008983;
    locEnd = inputs.getLocLat() + 0.008983;

    Query filterData = mRef1.orderByChild("locLat").startAt(locStart).endAt(locEnd);

    filterData.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Match matchd = dataSnapshot.getValue(Match.class);
            Offer.setText(matchd.getfbName());
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

引用mRef1完美地检索数据,只有当我将查询应用于它时,它才会检索空值,数据肯定与查询匹配,我甚至对值进行了硬编码,但这似乎也不起作用。 / p>

我是否遗漏了应该在Firebase控制台上设置的内容?我确实设置了一个索引,并在我的日志中解决了一个警告,建议我在该字段上设置一个警告,这意味着Firebase正在识别字段和索引。

1 个答案:

答案 0 :(得分:1)

Firebase查询返回列表中子节点的子集。

所以如果你有一个地点列表:

locations: {
  location1: { lat: 42.010185, lon: -33.010185 },
  location2: { lat: -11.19645, lon:  52.461219 },
  location3: { lat: 33.14518,  lon: -11.128746 }
}

您可以使用以下方式查询位置:

ref.child("locations").orderByChild("lat").startAt(-12.0).endAt(-10)

您的数据缺少级别:您正在查询test,但却缺少我所拥有的location1location2location3级别。如果您添加此类级别,您的查询将能够匹配该子级。

您的下一个问题可能是Firebase数据库查询只能通过/过滤单个属性。这意味着对于地理查询,您目前只能在纬度上过滤经度,这只会使地理查询的一半。我建议您查看GeoFire,这是我们的地理查询库。它将每个项目的纬度和经度组合成一个geohash值,然后可以查询该值。