разработка RawQuery для Android - PullRequest
       2

разработка RawQuery для Android

0 голосов
/ 04 декабря 2018

Я создал свою базу данных и пытаюсь получить из своей таблицы количество всех полей, в которых логическое значение равно true, подсчитать их и сгруппировать по ключу.Когда я запускаю этот запрос в MySQL, он работает.Также, если я выполню запрос как String query = "SELECT "+LATITUDE+", "+LONGITUDE+", COUNT(*) FROM "+CHECKED_IN_TABLE+" GROUP BY "+LATITUDE+", "+LONGITUDE;, он также будет работать, но это даст мне счет, сгруппированный по широте и долготе.Есть идеи?Ошибка прослеживается до объявления курсора, строка 4, я думаю, из-за rawQuery !.Заранее спасибо.

public List<String> getCurrentCrowd(){
    SQLiteDatabase db = this.getWritableDatabase();
    String query = "SELECT "+LATITUDE+", "+LONGITUDE+",COUNT(*) FROM "+CHECKED_IN_TABLE+" WHERE currnet = true GROUP BY "+LATITUDE+", "+LONGITUDE;
    Cursor cursor = db.rawQuery(query,null);
    List<String> locations = new ArrayList<>();
    if(cursor.moveToFirst()){
        while (!cursor.isAfterLast()){
            String latitude = cursor.getString(cursor.getColumnIndex(LATITUDE));
            String longitude = cursor.getString(cursor.getColumnIndex(LONGITUDE));
            int count = cursor.getInt(cursor.getColumnIndex("COUNT(*)"));
            locations.add(latitude+","+longitude+","+count);
            cursor.moveToNext();
        }
    }
    return locations;
}

1 Ответ

0 голосов
/ 04 декабря 2018

Я считаю, что ваша проблема в том, что в SQLite (который НЕ является MySQL ) нет логического типа, и поэтому вы не можете использовать = true.Вместо этого вам придется указать и проверить на истинность или ложь другим способом.

2.1.Тип данных Boolean SQLite не имеет отдельного класса хранения Boolean.Вместо этого логические значения хранятся в виде целых чисел 0 (ложь) и 1 (истина).

Типы данных в SQLite версии 3

Наиболее эффективным способом будетназначить для currnet значение, равное 1 (true) или 0 (false), а затем использовать WHERE currnet <> 0 для отражения true.

Если учесть следующее, где current установлен в 1 или 0:-

DROP TABLE IF EXISTS checked_in;
CREATE TABLE IF NOT EXISTS checked_in (longitude REAL, latitude REAL, currnet INTEGER);
INSERT INTO checked_in VALUES
    (100.10,200.10,1),(100.10,200.10,0),(100.10,200.10,1),
    (120.10,200.10,1),(120.10,200.10,0),(120.10,200.10,1),
    (120.10,210.10,1),(120.10,210.10,1),(120.10,210.10,1),
    (130.10,200.10,0),(130.10,200.10,0),(130.10,200.10,0),
    (140.10,200.10,1),(140.10,200.10,0),(140.10,200.10,0)
;
SELECT * FROM checked_in;

Таблица в полном объеме будет: -

enter image description here

Если вы затем рассмотрите запрос, который разрешит:-

SELECT LATITUDE, LONGITUDE,COUNT(*) FROM CHECKED_IN WHERE currnet = true GROUP BY LATITUDE, LONGITUDE;

Сбой, потому что true не является ключевым словом SQLite, а затем считается именем столбца, например: -

 > no such column: true

Однако, если вывместо этого используйте: -

SELECT LATITUDE, LONGITUDE,COUNT(*) FROM checked_in WHERE currnet <> 0 GROUP BY LATITUDE, LONGITUDE;

Результат: -

enter image description here

Поэтому вам нужно использовать SQLite в соответствии с его SQL, а нечем в соответствии с MySQL SQL.Если вы использовали тип столбца BOOL или BOOLEAN, это само по себе не является проблемой из-за гибкости SQLite.Однако вы не можете использовать TRUE или FALSE для сравнения.В противном случае ваш код выглядит нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...