2015-09-27 125 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的長度保持往上走。 讓我只是挖一個洞,消失在它。