我创建了数据库,并试图从表中获取布尔值为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;
}
答案 0 :(得分:0)
我相信您的问题是 SQLite 中没有布尔类型(不是MySQL ),因此您不能使用 = true
< / strong>。取而代之的是,您必须用另一种方式指示并测试对错。
2.1。布尔数据类型SQLite没有单独的布尔存储类。而是将布尔值存储为整数0(false)和1 (是)。
最有效的方法是为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;
完整表格为:-
如果您随后考虑查询,它将解析为:-
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;
结果是:-
因此,您需要根据SQLite而不是MySQL SQL使用SQLite。如果您使用的是BOOL或BOOLEAN列类型,由于SQLite的灵活性,它本身就不是问题。但是,您不能使用TRUE或FALSE进行比较。否则,您的代码似乎没问题。