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

时间:2016-12-27 22:50:19

标签: android mysql database sqlite

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

在将文件移动到我的计算机并使用this db浏览器打开数据库之后,我查看了数据库的内容,我可以看到我的条目。

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

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;
}

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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