可能会迟到,但以防其他人面临同样的问题。
很有可能将 GeoFire 数据与现有数据进行集成和操作。
许多开发人员面临的主要挑战是他们无法在不删除现有数据的情况下更新 GeoFire 地理定位,如本期 geofire-java/issues/134 中所述,使用 geoFire.setLocation("id", location); 删除现有数据。
这是我的解决方案。
1.在 FireBase 上使用 GeoFire 设置混合数据
让我们考虑下面的结构:
|-userExtra :
|-userId1 :
|- userId : "userId1",
|- userName : "Name1",
|- <geofireData> (i and g)
|...
|-userId2 :
|- userId : "userId2",
|- userName : "Name2",
|- <geofireData> (i and g)
|...
您可以使用GeoHash geoHash = new GeoHash(location) 生成geoHash,并直接在firebase 中将值设置为子级。
/*Java Code*/
void setGeoFireMixData(UserExtra user, Location location){
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
ref = ref.child("users").child(user.userId);
//Setting userData if needed
ref.child("userId").setValue(user.id);
ref.child("Name").setValue(user.name);
// .... other references
//Setting GeoFire Data
GeoHash geoHash = new GeoHash(location);
ref.child("l").setValue(Arrays.asList(location.latitude, location.longitude));
ref.child("g").setValue(geoHash.getGeoHashString());
}
2。使用 GeoFire 获取混合数据
关于问题:
这可以通过 key_entered 方法实现吗?有没有人创建过类似的解决方案?即使位置信息不断更新,这真的有那么糟糕吗?
我想说,您不能仅使用 GeoQueryEventListener 和 onKeyEntered 来检索额外数据和 GeoFire。您将需要使用GeoQueryDataEventListener。为此,您可以考虑上面定义的结构来定义数据的 PoJo。
...
GeoQueryDataEventListener geoQueryDataEventListener = new GeoQueryDataEventListener() {
@Override
public void onDataEntered(DataSnapshot dataSnapshot, GeoLocation location) {
UserExtra user = dataSnapshot.getValue(UserExtra.class);
actionOnUser(user);
}
...
};
...
geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude,longitude), 0.5);
geoQuery.addGeoQueryDataEventListener(geoQueryDataEventListener);
...
UserExtra 类可以定义如下:
public class UserExtra implements Serializable {
String userId;
String name;
...
List<Double> l; //GeoLocation
String g;
}
这将为您提供节点中的所有数据,包括 geoFire 数据。