可以根据需要手动从Firebase检索数据以及如何组合查询?

时间:2016-05-31 12:43:20

标签: java android google-maps firebase-realtime-database

我有一个Firebase实时数据库,其中包含一组与Google地图上的位置相关的项目。因此,Firebase中的每个孩子都有这样的数据结构。

-item
latitude:"5511231165654"
longitude:"516891812013216"
postalcode: "10013"
cityname: "New York"

在我的应用中,数据库中的每个项目都以标记的形式添加到Googlemap上的相关位置。 现在我认为将所有项目发送给所有用户并不是一个好主意。向用户发送仅与他们相关的这些项目更有效率。这些项目是与用户位于同一区域的项目,在这种情况下,相同区域意味着相同的邮政编码。

为了解决这个问题,我构建了这个查询

 Query sortedByLocation = myRef.orderByChild("postalcode").equalTo(currentpostalcode);
 sortedByLocation.addListenerForSingleValueEvent(
 new ValueEventListener() {
      .
      . do something
      .
}

我从地理编码器获得了当前的广告代码也是城市名称。现在问题是有时Geocoder无法解码邮政编码并为其返回null,但它总是返回一个城市名称。所以我将查询更改为

Query sortedByLocation = myRef.orderByChild("cityname").equalTo(currentcity);

那么我怎样才能将这两个问题结合起来呢?我想做这样的事情:

is postalcode == null than check for cityname

另一个问题是,是否可以根据需要手动检索数据?

想象一下,用户启动应用程序,应用程序现在可以获取与用户位于同一区域的所有项目,但现在用户离开了此区域并进入其他区域。

如何在不重新启动应用的情况下触发检索此新区域的新数据?

1 个答案:

答案 0 :(得分:0)

Firebase查询只能包含单个排序/过滤条件。

有时您可以将多个值组合到一个属性中以获得所需的行为。有关示例,请参阅我的答案:Query based on multiple where clauses in firebase

但总的来说,听起来你可能最好使用GeoFire,它使用GeoHashes(一种将经度和纬度结合到一个属性中的方式)来允许根据它们到点的距离来过滤项目。请注意,目前,GeoFire for Java的更新版本仍在使用中。