Geofire 需要很多时间来加载密钥

Geofire taking a lot of time to load keys

我有一个 android 应用程序,它使用 GPS 位置和 GeoFire 获取附近的钥匙。 firebase 数据库中大约有 15,000 个键。从 Android 应用程序加载附近的钥匙大约需要 20 秒。为什么会这样?尽管 Firebase Geofire 官方文档指出

GeoFire selectively loads only the data near certain locations, keeping your applications light and responsive, even with extremely large datasets.

Geofire Github Page

当我们遵循推荐的数据库时,GeoFire 表现非常好 structure.To 了解更多有关使用 goefire 构建数据的最佳方法的信息,请查看此 linkRecommended database structure with GEOFIRE

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

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

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

确保您只将 GeoHash 和 Lat / Lon 数据存储在您的 geofire 集合中。如果您需要存储其他数据,您可以使用相同的键将其存储在另一个集合中,并发出单独的查询以根据需要取回该数据。

我用的是这个结构,貌似效果不错

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

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

保存数据时,您将使用以下方式单独保存 geofire 数据:

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);

希望这对您有所帮助。 :)

感谢您的回答。

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