首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rawQuery安卓系统开发

rawQuery安卓系统开发
EN

Stack Overflow用户
提问于 2018-12-04 12:25:44
回答 1查看 47关注 0票数 1

我创建了我的数据库,我试图从我的表中获得布尔值为真的所有字段的计数,计数它们并按键对它们进行分组。当我在mysql中运行这个查询时,它可以工作。另外,如果我以String query = "SELECT "+LATITUDE+", "+LONGITUDE+", COUNT(*) FROM "+CHECKED_IN_TABLE+" GROUP BY "+LATITUDE+", "+LONGITUDE;的身份运行查询,它也会工作,但这将给出一个由lat和Lon分组的计数。有什么想法吗?错误可追溯到游标声明第4行,我认为是由于rawQuery!。提前谢谢。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-04 19:25:51

我相信您的问题是,SQLite中没有布尔类型(不是MySQL),因此不能使用。相反,您必须以另一种方式指示和测试真或假。

2.1。布尔数据类型SQLite没有单独的布尔存储类。相反,布尔值存储为整数0 (false)和1 (true)。

SQLite版本3中的数据类型

最有效的方法是将一个值赋值给currnet,即1 ( true )或0 (false),然后使用WHERE currnet <> 0来反映真。

如果考虑到以下情况,则当前设置为1或0 :-

代码语言:javascript
复制
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;

该表全文如下:-

如果您然后考虑查询,它将解析为:-

代码语言:javascript
复制
SELECT LATITUDE, LONGITUDE,COUNT(*) FROM CHECKED_IN WHERE currnet = true GROUP BY LATITUDE, LONGITUDE;

这失败是因为true不是SQLite关键字,然后被视为列名,例如:-

代码语言:javascript
复制
 > no such column: true

但是,如果您使用的是:

代码语言:javascript
复制
SELECT LATITUDE, LONGITUDE,COUNT(*) FROM checked_in WHERE currnet <> 0 GROUP BY LATITUDE, LONGITUDE;

结果是:-

因此,您需要根据SQLite而不是MySQL SQL使用它。如果您使用了BOOL或布尔值的列类型,这本身并不是一个问题,因为SQLite具有灵活性。但是,不能使用TRUE或FALSE进行比较。否则,您的代码似乎没有问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53612981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档