繁体   English   中英

Android SQL查询无法识别第一个条目

[英]Android SQL query not recognizing first entry

扣好乡亲,这是一个奇怪的事情。 我目前正在开发一个涉及在sqlite数据库中存储和检索数据的android应用。 我正在浏览该应用程序,并测试了一些基本功能以确保一切正常,然后发现我从数据库中检索数据时发现了一个错误。 当用户将他们的第一个条目输入应用程序时,一切都会按预期进行,值会被处理和存储。 但是,当我返回并尝试使用SELECT * FROM history;访问该数据时SELECT * FROM history; 当我调用data.moveToNext() ,我得到一个返回true的游标,但是当我使用while(data.moveToNext()) { //get values and add to a List<> }遍历它while(data.moveToNext()) { //get values and add to a List<> } while循环永远不会执行。

将文件移至计算机并使用数据库浏览器打开数据库后,我查看了数据库的内容,我可以看到我的输入。

这是我从数据库中获取所有点的方法:

List<PointValue> getAllPoints() {
    List<PointValue> points;
    Cursor data = rawQuery("SELECT * FROM history");
    if (data.moveToNext()) {
        points = new ArrayList<>();
        while (data.moveToNext()) {
            System.out.println("Looped");
            long timestamp = data.getLong(data.getColumnIndexOrThrow("timestamp"));
            int level = data.getInt(data.getColumnIndexOrThrow("level"));
            points.add(new PointValue(timestamp, level));
        }
    } else {
        return null;
    }
    data.close();
    if (points.size() == 0) {
        return null;
    }
    return points;
}

rawQuery方法如下所示:

private Cursor rawQuery(String sql) {
    SQLiteDatabase db = this.getReadableDatabase();
    return db.rawQuery(sql, null);
}

当我尝试自行调试时,即使我知道数据库中至少有一个点, points的大小也为0。 思考? 包含我所有与SQL相关的东西的类扩展了SQLiteOpenHelper

编辑:这是@Isaac Payne建议的解决方案(仍然不起作用):

public List<PointValue> getAllPoints() {
    List<PointValue> points = new ArrayList<>();
    Cursor data = rawQuery("SELECT * FROM history");

    while (data.moveToNext()) {
        long timestamp = data.getLong(data.getColumnIndexOrThrow("timestamp"));
        int level = data.getInt(data.getColumnIndexOrThrow("level"));
        points.add(new PointValue(timestamp, level));
    }
    data.close();
    if (points.size() == 0) {
        return null;
    }
    return points;
}

问题是,当您在if语句中调用data.moveToNext() ,您将移至第一个条目,然后在while循环中再次调用moveToNext() ,移至第二个不存在的条目。 尝试删除if语句

在if循环之前添加data.moveToFirst()。

Cursor data = rawQuery("SELECT * FROM history");
//add this line
data.moveToFirst();
if (data.moveToNext()) {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM