2017-05-06 44 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); 

希望這有助於。 :)

相關問題