开发者社区> 问答> 正文

Android sqlite在计算列上排序(坐标距离)

我正在使用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数据库吗?如果不是我唯一想到的选择,就是要有一个额外的列,遍历每行上运行上述功能的行,并在该行上填写一个额外的列,然后对该列进行排序?

展开
收起
Puppet 2020-01-24 16:23:32 754 0
1 条回答
写回答
取消 提交回答
  • 这不会完全有帮助,但是对于这种情况,请认真考虑使用rawQuery()代替query(),这样您就可以传递完整的SQL语句,而不必将其分成几部分。

    您更大的问题是我看不到SQLite具有三角函数。

    您没有指明使用方式,Cursor而是从查询中返回。例如,如果你正在把Cursor成某种的CursorAdapter,你可以:

    将转换Cursor为ArrayList ,您在其中Position定义数据的Java类在哪里 关闭Cursor,以释放占用的RAM 排序ArrayList 使用Arrays.sort() 包裹ArrayList 在一个ArrayAdapter 和使用,你一直在使用你的CursorAdapter

    2020-01-24 16:25:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载