2017-05-06 46 views
0

我有一个Android应用程序,它使用GPS位置和GeoFire获取附近的按键。 Firebase数据库中有大约15,000个密钥。从Android App载入附近的钥匙大约需要20秒。为什么这样?虽然火力地堡Geofire官方文件指出Geofire花费大量时间加载密钥

GeoFire选择性地只加载附近特定位置的数据,让您的应用程序轻,反应灵敏,即使有非常大的数据集。

Geofire Github Page

+0

您是否在数据库中为'g'属性添加了索引,如[此处]所述(https://github.com/firebase/geofire-java#upgrading-from-geofire-10x-to-11x)并显示在这个[示例](https://github.com/firebase/geofire-js/blob/master/examples/securityrules/rules.json)? –

回答

1

感谢您的答案。

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

1

GeoFire表现得非常好,当我们按照推荐的数据库structure.To了解更多关于最好的方式与goefire结账构建数据这个环节Recommended database structure with GEOFIRE

现在有以下方式你可以改善您的查询以快速获得结果,即使我不知道您的具体使用情况,这可能会有帮助

  1. 如果您有非常大的数据集,请尝试在不断增加的半径范围内进行多个查询(如果您不执行任何需要一次全部数据的操作,则此方法很有用)可以把最低要求的比赛中geofire查询和显示的keyEntered方法导致的,而不是等待所有的比赛。(这是有益的,如果你是显示在列表视图或recyclerView数据)

1

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

我使用这种结构,这似乎工作得很好。

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

那么你将分别保存在火力数据:

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

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

希望这有助于。 :)

相关问题