2012-03-21 101 views
0

早上好,我在嘗試從我的數據庫同時刪除多行時遇到了一些問題。當我調試應用程序時引發異常(CursorIndexOutOfBoundsException),我無法弄清楚如何解決這個問題。提前致謝。從SQLite數據庫中刪除多行的問題

btnDel.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
     DBAdapter db = new DBAdapter(getBaseContext()); 

     db.open(); 
     Cursor c = db.getAllContacts(); 
     int rowId = c.getInt(0); 
     while(c.getCount() > 50) 
     { 
      db.deleteContact(rowId); 
        Toast.makeText(getBaseContext(), "Deleted", Toast.LENGTH_SHORT).show(); 
     }  
     db.close(); 
     } 
    }); 

回答

1

我相信你想刪除誰擁有ID值比更大的記錄。

DBAdapter db = new DBAdapter(getBaseContext()); 
db.open(); 
Cursor c = db.getAllContacts(); 

while(c.moveToNext()) 
{ 
    int rowId = c.getInt(0); 
    if(rowId > 50){ 
     db.deleteContact(rowId); 
     Toast.makeText(getBaseContext(), "Deleted", Toast.LENGTH_SHORT).show(); 
    } 
} 
c.close(); 
db.close(); 
+0

其實我試圖限制行數爲50,刪除舊的條目(行較低的_id),但這已經幫了我很多,謝謝 – 2012-03-21 13:48:47

0

事實上,你必須在昏迷分隔的字符串數據傳遞,然後編寫使用IN(]多個ID的])

如刪除查詢,

DELETE FROM Persons 
WHERE LastName IN ('Person1','Person2',"Person3") 
1

您的主要問題是在這裏:

int rowId = c.getInt(0); 
    while(c.getCount() > 50) 
    { 
     db.deleteContact(rowId); 

我不認爲遊標會知道它的一行被刪除,而它仍然是o鋼筆。因此,遊標不會自動將已刪除的行從其「緩存」中移除,這意味着在通過已刪除的遊標訪問行時遇到麻煩。

我建議使用帶有適當where子句的單個delete語句,這也有助於提高性能。

也許是這樣的:找到你想要保留的第一行(最小rowId),這是你最後一行之前的50行。然後你可以執行delete from ... where _id < minimalRowId。看看moveToPosition;那麼你可以使用cursor.moveToPosition(cursor.getCount() - 50)找到你感興趣的行。