我正在尝试过滤我的 Firebase 数据,我的数据集很复杂,但这里有一个示例。我能够很好地检索数据,但无法使用 Firebase 查询进一步过滤该数据。这是一个示例数据集:
这是我的查询:
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 完美地检索数据,只有当我对其应用查询时,它才会检索空值,数据肯定与查询匹配,我什至对值进行了硬编码,但这似乎也不起作用。
我是否缺少应该在 Firebase 控制台上设置的内容?我确实设置了一个索引,并解决了日志中的一条警告,该警告建议我在字段上设置一个索引,这意味着 Firebase 也能识别该字段和索引。
最佳答案
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
,但缺少 location1
、location2
、location3
我在其下的级别。如果添加这样的级别,您的查询将能够匹配子级。
您的下一个问题可能是 Firebase 数据库查询只能对单个属性进行排序/过滤。这意味着对于地理查询,您目前只能按经度或纬度进行过滤,这只能实现一半的地理查询。我建议您查看GeoFire ,这是我们的地理查询库。它将每个项目的纬度和经度组合成一个 geohash值,然后可以查询。
关于java - 即使引用检索数据,Firebase 查询也无法在 Android 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41569846/