扣上人们,这很奇怪。我目前正在研究一个涉及在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;
}
答案 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()) {