我有一个Android应用程序,使用GPS位置和GeoFire
来获取附近的密钥。 firebase数据库中有大约15,000个键。从Android App加载附近的密钥大约需要20秒。为什么会这样?虽然Firebase Geofire官方文档说明了
GeoFire选择性地仅加载某些位置附近的数据,即使对于非常大的数据集,也能保持应用程序的轻量级和响应性。
答案 0 :(得分:2)
感谢您的回答。
我通过将g (geohash)
放入Firebase数据库的安全规则,在".indexOn": ["g"]
上建立索引来解决我的问题。
答案 1 :(得分:1)
当我们遵循推荐的数据库结构时,GeoFire表现得非常好。通过goefire checkout了解更多关于构建数据的最佳方式此链接Recommended database structure with GEOFIRE
现在有以下方法可以改进您的查询以快速获得结果,即使我不知道您的确切用例,这可能会有所帮助
如果您有非常大的数据集,请尝试在增加半径的情况下进行多次查询。(如果您不执行任何一次需要所有数据的操作,这种方法很好)
如果您想保持更好的用户体验,可以在地理位置查询的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);
希望这会有所帮助。 :)