Android Studio: SQLite Database Query для получения ближайшего местоположения из координат - PullRequest
0 голосов
/ 01 октября 2019

Итак, у меня есть база данных кемпингов со столбцом названия, широты и долготы. Я пытаюсь выполнить запрос, используя объект курсора, но не могу заставить его работать.

У меня есть:

 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 место для лагеря,AKA ближайший лагерь, чтобы я мог передать имя и координаты в функцию Google Maps. Правильно ли я набираю запрос для получения ближайшего местоположения на основе широты и долготы?

Среда 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);

1 Ответ

0 голосов
/ 01 октября 2019

HAVING требуется предложение GROUP BY согласно выделенной части: -

enter image description here

SQL как понял SQLite - SELECT

Вы хотите использовать ГДЕ вместо наличия, поэтому: -

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 будет соответствоватьэто построено (что вы должны проверить).
...