【问题标题】:Android SQL query not recognizing first entryAndroid SQL 查询不识别第一个条目
【发布时间】:2016-12-27 22:50:18
【问题描述】:

系好安全带,这很奇怪。我目前正在开发一个涉及在 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;
}

【问题讨论】:

  • 如果你记录 data.getCount() 你会得到 1 个条目吗?
  • @IsaacPayne 刚刚意识到我在调试完全错误的方法,我按照您的建议编辑了正确的方法,并且效果很好。谢谢!

标签: android mysql database sqlite


【解决方案1】:

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

【讨论】:

  • 如果有返回响应中记录数的方法,可以使用if (data.numRecords() &gt; 0)代替。
  • 不走运,更新的方法在我原来问题的底部
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2015-03-29
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2021-03-16
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多