【发布时间】: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