2015-09-27 117 views
0

所以我一直在尝试将SQLite数据库的内容转换为ArrayList中的对象。为了做到这一点,我试着像下面的代码一样遍历表格。但是这并不会返回指定主题的每个标记,而是会在表格中迭代大约70-80次。我想我知道这个问题,因为c.moveToNext移动到下一行而不是下一行,但我不知道解决方案。将SQLite数据库转换为Java Arraylist

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; 
} 

此代码似乎严重损坏,因为它也可能得到错误的名称在数据库中的第三项,但onnly在while循环的前半部分。我该如何做到这一点,所以光标在一行,读取该行所需的条目,然后继续到下一行?

编辑:原来我是完全愚蠢的,每次启动应用程序时不断向列表中添加新条目。

+0

你应该通过你的主题作为参数来防止SQL注入。 – leeor

+0

@MrQweep此代码看起来很好,除了一行'if(c.getColumnIndex(“subject”)!= 0)'没有使用这一行。 'c.moveToNext'也会移动到下一行,而不是下一列。发布您的预期结果和实际结果 –

+0

尝试使用命令行sqlite程序检查数据库。这可能是因为数据不准确。 – mksteve

回答

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(); 
0

见编辑,我只是​​不停地将数据添加到数据库中,我注意到当ArrayList的长度保持往上走。 让我只是挖一个洞,消失在它。

相关问题