我需要你的帮助!
我正在创建一个Android应用,该应用在列表中和地图上显示有关用户实际位置的对象。 我使用GeoFire和Firebase。 在Firebase中,差不多存储了15,000个对象:
{
"01_001_00001" : { .... },
"01_001_00002" : { .... },
...........
"18_026_00078" : { .... }
}
首先,我以纬度/经度运行GeoFire,该操作会返回对象ID列表。
然后,我查询Firebase以获取与ID对应的对象。
这很好,但是速度很慢...
从对象的ID查询对象所需的时间取决于数据库中的订单位置!在我看来,这太疯狂了。 (SQL为赢)。
这是GeoFire返回新对象Key时触发的代码:
public void onKeyEntered(string key, GeoLocation location)
{
Console.WriteLine("TODEBUG new GeoFire key : " + key);
m_DBRefActivite.Child(key).AddListenerForSingleValueEvent(m_activityValueListener);
}
这是Firebase返回与先前查询的ID相对应的新Object时执行的代码:
public void HandleActivityValueEventListenerOnChanged(object sender, EventArgs args)
{
Activite newAct = ((ActivityEventArgs)args)?.value;
if (newAct != null)
{
Console.WriteLine("TODEBUG new Firebase object : " + newAct.activite_ID);
//Insert in the list
m_lsActivities.Add(newAct);
}
}
这段代码给出了一个奇怪的结果:当我查询一个数据库中第一个位置附近的对象(按键排序)时,请求很快:200ms
当我查询数据库中居中位置附近的对象(按键排序)时,请求需要5秒钟。
如果我查询数据库中最后一个对象附近的对象(按键排序),则请求需要10秒...
以下是日志(已清理并带有我自己的注释来解释我的问题):
//Query object ID = 01_026_00199 : 200ms
08-01 10:47:44.582 I/mono-stdout(30118): TODEBUG new GeoFire key : 01_026_00199
08-01 10:47:44.772 I/mono-stdout(30118): TODEBUG new Firebase object : 01_026_00199
//Query object ID = 09_003_00116 : 5sec
08-01 10:49:37.900 I/mono-stdout(30118): TODEBUG new GeoFire key : 09_003_00116
08-01 10:49:43.093 I/mono-stdout(30118): TODEBUG new Firebase object : 09_003_00116
//Query object ID = 18_026_00022 : 10sec
08-01 10:44:15.634 I/mono-stdout(30118): TODEBUG new GeoFire key : 18_026_00022
08-01 10:44:25.857 I/mono-stdout(30118): TODEBUG new Firebase object : 18_026_00022
有什么优化我的代码的想法吗?不论ID如何,如何在200ms内获取对象?