【问题标题】:Android Studio : SQLite Database Query for getting closest location from coordinatesAndroid Studio:用于从坐标获取最近位置的 SQLite 数据库查询
【发布时间】:2019-10-01 12:06:52
【问题描述】:

所以我有一个包含名称、纬度和经度列的露营地数据库。 我正在尝试使用游标对象执行查询,但似乎无法正常工作。

我有:

 Campsite getClosestCampsite() {
    SQLiteDatabase db = this.getReadableDatabase();
    String query = "SELECT COL_NAME, COL_LATITUDE, COL_LONGITUDE, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM TABLE_CAMPSITES HAVING distance < 25 ORDER BY distance LIMIT 0 , 1;";
    Cursor cursor = db.rawQuery(query, null);

    Campsite campsite = new Campsite();
    campsite.setName(cursor.getString(1));
    campsite.setLatitude(cursor.getDouble(6));
    campsite.setLongitude(cursor.getDouble(7));
    cursor.close();
    return campsite;
}

所以我只是想返回 1 个露营地,也就是最近的露营地,这样我就可以将名称和坐标传递给谷歌地图功能。 我是否输入了正确的查询以获得基于纬度和经度的最近位置?

IDE 下划线 HAVING 并给我 , , , AS GROUP 或预期的分号

表结构:

@Override
public void onCreate(SQLiteDatabase db) {
    // CREATE TABLE
    String CREATE_CAMPSITES_TABLE = "CREATE TABLE " + TABLE_CAMPSITES + "("
            + COL_ID + " INTEGER PRIMARY KEY," + COL_NAME + " TEXT,"
            + COL_CITY + " TEXT," + COL_FEATURE + " TEXT," + COL_FAVORITE + " TEXT," + COL_RATING + " INTEGER," + COL_LATITUDE + " REAL," + COL_LONGITUDE + " REAL" + ")";
    db.execSQL(CREATE_CAMPSITES_TABLE);

【问题讨论】:

  • HAVING -> WHERE
  • 另外,LIMIT 1

标签: java android sqlite android-sqlite


【解决方案1】:

HAVING 需要 GROUP BY 子句,根据突出显示的部分:-

SQL As Understood By SQLite- SELECT

您想使用 WHERE 而不是拥有,所以:-

String query = "SELECT COL_NAME, COL_LATITUDE, COL_LONGITUDE, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM TABLE_CAMPSITES WHERE distance < 25 ORDER BY distance LIMIT 0 , 1;"

然后,您将收到错误 CURSOR INDEX OUT OF BOUNDS,因为在生成游标后,它位于第一行 (-1) 之前。你需要移动到光标中的一行(如果有的话)使用类似的东西:-

Campsite campsite = new Campsite();
if (cursor.moveToFirst() {
    campsite.setName(cursor.getString(1));
    campsite.setLatitude(cursor.getDouble(6));
    campsite.setLongitude(cursor.getDouble(7));
}
cursor.close();
return campsite;
  • 请注意,如果未选择任何行,则返回的 Campsite 对象将与构造时一致(您应该检查)。

【讨论】:

  • @Shawn oops 将修复。
  • 我认为最好只获得整行,这样我就可以将所有田野归还露营地。这对于在我的地图活动中检索对象是否不起作用,因为我只设置了 3 个字段但有 7 列。那么我怎么能选择最近露营地的所有列。我想我必须使用 * 但我只是不知道语法,因为这个查询比我习惯的更复杂。
  • 字符串查询 = "SELECT * ( 3959 * acos( cos( 弧度(37) ) * cos( 弧度( lat ) ) * cos( 弧度( lng ) - 弧度(-122) ) + sin (弧度(37))* sin(弧度(纬度))))作为距TABLE_CAMPSITES的距离,其中距离
  • 我不相信你明白。如果没有计算出的距离 moveToFirst() 将返回 false(并且光标位于最后一行之后)。因此没有任何值(因为没有任何值可以使用),因此在返回 Campsite 对象时不会设置名称、纬度和经度。关于第二条评论,您需要在第一个 * 之后使用逗号。简而言之,您可能需要处理no campsites within a distance of 25 的情况,并且注释是对此的警告。
  • 哦,我错过了。需要明确的是,无论如何我都会返回一个露营地,因为我要将距离更改为 3000 英里。所有露营地的坐标都在加利福尼亚州,并且它正在测试的位置也在加利福尼亚州,所以它会正确返回最近的位置吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 2017-05-29
相关资源
最近更新 更多