我有大约 12 000 个条目的数据库。每个条目都给出了纬度、经度和空距。我需要做的是从当前 GPS 位置找到 25 个最近的条目。我的 ORM 是 greenDao。
有 2 个问题:我还不知道我和条目之间的距离,并且我无法将所有条目加载到 RAM,因为当我这样做时,堆会上升到 70MB,并且应用程序在 OutOfMemoryException 处崩溃(所以我需要使用延迟加载)。
我尝试了这种方法:
- 获取给定表的迭代器
- 加载条目,计算它与我当前位置的距离,将条目保存到 ArrayList 缓冲区(我每 1000 个条目将缓冲区刷新回数据库(它只是 updateInTx(...))然后清理它)
- 重复第 2 点,直到 iterator.hasNext();
- 从具有limit(25).orderAsc() 的条目中查询
- 结果
这行得通,但从第 1-3 点开始非常慢(在 Nexus 7 上大约需要 25 秒)。休息大约需要 1.5 秒。
每次用户启动应用程序或请求数据刷新时,我都必须这样做。任何想法如何更好地解决它?
谢谢
编辑:这是计算距离的函数,所以很难在 SQL 中做到这一点:(
double getDistance(GPSCoords myPos, Place place) {
double dlong = (place.getLongitude() - myPos.getLongitude()) * d2r;
double dlat = (place.getLatitude() - myPos.getLatitude()) * d2r;
double a = Math.pow(Math.sin(dlat / 2.0), 2) + Math.cos(myPos.getLatitude() * d2r)
* Math.cos(place.getLatitude() * d2r) * Math.pow(Math.sin(dlong / 2.0), 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double d = 6367 * c;
return d;
}