在GeoFire节点下存储额外数据

Kur*_*usu 4 firebase geofire

我通过GeoFire在我的数据库中存储位置数据,这里是结构:

geofire
  -Ke1uhoT3gpHR_VsehIv
  -Kdrel2Z_xWI280XNfGg
    -g: "dr5regw90s"
    -l
      -0: 40.7127837
      -1: -74.00594130000002
Run Code Online (Sandbox Code Playgroud)

它可以将位置的信息和地理数据存储在不同的节点中,但我认为在这些地理空间节点下存储一些额外的数据是有利的,例如企业的名称.通过这种方式,我只需拨打一次电话即可访问我的Firebase,以获取附近的位置及其名称.

这可以通过这种key_entered方法实现吗?有人创建过类似的解决方案吗?即使位置信息一直在更新,这真的是一个想法吗?

任何输入都表示赞赏!

小智 12

首先,您为应用程序使用的结构是错误的.

让我们举一个用户应用程序的例子

使用Geofire时,您有两个数据列表:

a list of user details for each user
a list of latitude and longitude coordinates for each user
Run Code Online (Sandbox Code Playgroud)

您试图将两者存储在这样的相同结构中

"users" : {
    <userId> : {
        "userData" : "userData",
         <geofireData> 
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试将userdata和geofiredata存储在一个节点中是一个坏主意,因为您将大部分静态数据(用户的属性)与高度易变的数据(地理位置信息)混合在一起.将两者分开可以提高性能,这就是Geofire强制执行的原因.

这就是为什么当您尝试将地理位置数据添加到用户节点时,它会覆盖该节点的先前用户详细信息.

您的数据库结构应该是这样的.

"Users" : {
    <UserId> : {
        "UserData" : "UserData",
        ...
    }
}
"Users_location" : {
    <UserId> : {
        <geofireData> ...
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,对于相同的用户ID,您可以为用户详细信息创建一个结构,另一个用于该用户的地理定位详细信息.

如何推送用户并设置地理位置数据.

String userId = ref.child("users").push().getKey();

ref.child("users").child(userId).setValue(user);

geoFire = new GeoFire(ref.child("user_location"));
geoFire.setLocation(userId, new GeoLocation(lattitude, longitude));
Run Code Online (Sandbox Code Playgroud)

您在地理定位中使用的userId与您在push()期间获得的userId相同.

因此,对于每个userId,您在anotehr结构中的一个结构和位置详细信息中都有用户详细信息.

要获取数据,首先需要在users_location节点上执行GeoQuery,然后在onKeyEntered方法上获取数据.参数键是我的示例中的userId.

geoFire=newGeoFire(FirebaseDatabase.getInstance().getReference().child("users_location");
geoQuery = geoFire.queryAtLocation(geoLocation), radius);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
    @Override
    public void onKeyEntered(String key, GeoLocation location) {
         //retrieve data
//use this key which is userId to fetch user details from user details structure
    }
};    
Run Code Online (Sandbox Code Playgroud)

快乐编码:)