Geofire花了很多时间来加载密钥

时间:2017-05-06 11:46:11

标签: firebase geofire

我有一个Android应用程序,使用GPS位置和GeoFire来获取附近的密钥。 firebase数据库中有大约15,000个键。从Android App加载附近的密钥大约需要20秒。为什么会这样?虽然Firebase Geofire官方文档说明了

  

GeoFire选择性地仅加载某些位置附近的数据,即使对于非常大的数据集,也能保持应用程序的轻量级和响应性。

Geofire Github Page

3 个答案:

答案 0 :(得分:2)

感谢您的回答。

我通过将g (geohash)放入Firebase数据库的安全规则,在".indexOn": ["g"]上建立索引来解决我的问题。

答案 1 :(得分:1)

当我们遵循推荐的数据库结构时,GeoFire表现得非常好。通过goefire checkout了解更多关于构建数据的最佳方式此链接Recommended database structure with GEOFIRE

现在有以下方法可以改进您的查询以快速获得结果,即使我不知道您的确切用例,这可能会有所帮助

  1. 如果您有非常大的数据集,请尝试在增加半径的情况下进行多次查询。(如果您不执行任何一次需要所有数据的操作,这种方法很好)

  2. 如果您想保持更好的用户体验,可以在地理位置查询的keyEntered方法中放置最少的必需匹配项并显示结果,而不是等待所有匹配项。(如果您在listview中显示数据或recyclerView)

答案 2 :(得分:1)

确保您只将GeoHash和Lat / Lon数据存储在地理阵列集合中。如果您需要存储其他数据,则应将其存储在具有相同密钥的另一个集合中,并发出单独的查询以根据需要获取该数据。

我使用这种结构似乎运作良好。

app-id
-> geodata
--> geofire
---> key
----> g: <geohash>
-----> l: 
-------> 0: Lat
-------> 1: Lon

--> other
---> key
----> <otherhash object>

保存数据时,您将使用以下方法单独保存地理位置数据:

mDatabase = FirebaseDatabase.getInstance().getReference("geodata");      

geoFire = new GeoFire(mDatabase.child("geofire"));

geoFire.setLocation(people.key, new GeoLocation(people.Lat, people.Lon));

然后你会在firebase中单独保存你的数据:

    mDatabase = FirebaseDatabase.getInstance().getReference("geodata");

    mDatabase.child("other").child(people.key).setValue(people);

希望这会有所帮助。 :)