所以我一直在尝试将SQLite数据库的内容转换为ArrayList中的对象。为此,我尝试迭代表格,如下面的代码所示。但是这并没有一次返回指定主题的每个标记,而是在表格中重复约70-80次。我想我知道这个问题,因为c.moveToNext移动到行的下一列而不是下一行,但我不知道解决方案。
public ArrayList<Marks> toMarksList(String subject){
ArrayList<Marks> marksArrayList = new ArrayList<Marks>();
SQLiteDatabase db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_MARKS + " WHERE " + COLUMN_SUBJECT + "=\"" + subject + "\";";
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
while(!c.isAfterLast()){
if(c.getColumnIndex("subject")!=0){
String dbName = c.getString(c.getColumnIndex("name"));
Double dbValue = c.getDouble(c.getColumnIndex("value"));
Double dbWeight = c.getDouble(c.getColumnIndex("weight"));
marksArrayList.add(new Marks(subject, dbName, dbValue, dbWeight));
}
c.moveToNext();
}
db.close();
return marksArrayList;
}
此代码似乎被严重破坏,因为它也为数据库中的第三个条目获取了错误的名称,但仅在while循环的前半部分中。如何使光标位于一行,读取该行所需的条目然后继续到下一行?
编辑:结果我完全愚蠢,并且每次启动应用程序时都会在列表中添加新条目。
答案 0 :(得分:1)
但是这并没有一次返回指定主题的每个标记,而是在表中迭代大约70-80次。
我没有看到多次迭代表格的证据。 如果这是你以某种方式观察到的, 它不在发布的代码中,而是在此方法的调用者中。
无论如何,我建议改进那里的主循环,如下所示:
Cursor c = db.rawQuery(query, null);
while (c.moveToNext()) {
String dbName = c.getString(c.getColumnIndex("name"));
Double dbValue = c.getDouble(c.getColumnIndex("value"));
Double dbWeight = c.getDouble(c.getColumnIndex("weight"));
marksArrayList.add(new Marks(subject, dbName, dbValue, dbWeight));
}
db.close();
答案 1 :(得分:0)
看到编辑,我只是不断向数据库添加数据,当ArrayList的长度不断增加时我注意到了这一点。 让我挖一个洞并消失在其中。