我正在使用SQLITE数据库存储位置的纬度和经度。
我希望能够按距当前位置的粗略距离对结果进行排序。我已经将设备的当前位置设置为double(lat,lng),数据库中的lat和lng也是double。
我想要的是一个查询,该查询将创建一个虚拟列,用于对结果进行排序。
我目前使用一个函数来显示所选记录的距离:
float pk = (float) (180/3.14159);
float a1 = (float) (db_lat / pk);
float a2 = (float) (db_lon / pk);
float b1 = (float) (current_lat / pk);
float b2 = (float) (current_lon / pk);
float t1 = FloatMath.cos(a1)*FloatMath.cos(a2)*FloatMath.cos(b1)*FloatMath.cos(b2);
float t2 = FloatMath.cos(a1)*FloatMath.sin(a2)*FloatMath.cos(b1)*FloatMath.sin(b2);
float t3 = FloatMath.sin(a1)*FloatMath.sin(b1);
double tt = Math.acos(t1 + t2 + t3);
double dist = (6366000*tt);
例如,一个MySQL选择可能是(摘自:www.movable-type.co.uk):
Select Lat, Lon, acos(sin($lat)*sin(radians(Lat)) + cos($lat)*cos(radians(Lat))cos(radians(Lon)-$lon))$R As dist From MyTable ORDER BY dist DESC
目前,我使用以下方法选择位置:
public Cursor locationGetAllRows(long groupid)
{
try
{
return db.query(LOCATION_DATABASE_TABLE, new String[] {
"_id", "lat","lon","groupid"},
"groupid="+groupid, null, null, null, null);
}
catch (SQLException e)
{
Log.e("Exception on query: ", e.toString());
return null;
}
}
可以,这样可以使用SQLITE数据库吗?如果不是我唯一想到的选择,就是要有一个额外的列,遍历每行上运行上述功能的行,并在该行上填写一个额外的列,然后对该列进行排序?
这不会完全有帮助,但是对于这种情况,请认真考虑使用rawQuery()代替query(),这样您就可以传递完整的SQL语句,而不必将其分成几部分。
您更大的问题是我看不到SQLite具有三角函数。
您没有指明使用方式,Cursor而是从查询中返回。例如,如果你正在把Cursor成某种的CursorAdapter,你可以:
将转换Cursor为ArrayList ,您在其中Position定义数据的Java类在哪里 关闭Cursor,以释放占用的RAM 排序ArrayList 使用Arrays.sort() 包裹ArrayList 在一个ArrayAdapter 和使用,你一直在使用你的CursorAdapter
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。