将SQLite数据库转换为Java Arraylist

时间:2015-09-27 12:14:22

标签: java android sqlite

所以我一直在尝试将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循环的前半部分中。如何使光标位于一行,读取该行所需的条目然后继续到下一行?

编辑:结果我完全愚蠢,并且每次启动应用程序时都会在列表中添加新条目。

2 个答案:

答案 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的长度不断增加时我注意到了这一点。 让我挖一个洞并消失在其中。