rawQuery Android开发

时间:2018-12-04 12:25:45

标签: android sqlite

我创建了数据库,并试图从表中获取布尔值为true的所有字段的计数,对其进行计数并按键对它们进行分组。当我在mysql中运行此查询时,它可以工作。另外,如果我以String query = "SELECT "+LATITUDE+", "+LONGITUDE+", COUNT(*) FROM "+CHECKED_IN_TABLE+" GROUP BY "+LATITUDE+", "+LONGITUDE;的形式运行查询,它也可以工作,但这将为我提供按lat和Lon分组的计数。有任何想法吗?该错误可追溯到Cursor声明的第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 :(得分:0)

我相信您的问题是 SQLite 中没有布尔类型(不是MySQL ),因此您不能使用 = true < / strong>。取而代之的是,您必须用另一种方式指示并测试对错。

  

2.1。布尔数据类型SQLite没有单独的布尔存储类。而是将布尔值存储为整数0(false)和1   (是)。

Datatypes In SQLite Version 3

最有效的方法是为currnet分配一个值为1(true)或0(false)的值,然后使用WHERE currnet <> 0来反映true。

如果考虑以下情况,则电流设置为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而不是MySQL SQL使用SQLite。如果您使用的是BOOL或BOOLEAN列类型,由于SQLite的灵活性,它本身就不是问题。但是,您不能使用TRUE或FALSE进行比较。否则,您的代码似乎没问题。