从SQLite数据库中删除多行时出现问题

时间:2012-03-21 13:32:59

标签: android database sqlite

早上好,我在尝试从我的数据库同时删除多行时遇到了一些问题。当我调试应用程序时抛出异常(CursorIndexOutOfBoundsException),我无法弄清楚如何解决这个问题。提前致谢。

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

3 个答案:

答案 0 :(得分:1)

我认为您要删除 ID 值大于 50 的记录。

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

答案 1 :(得分:1)

你的主要问题在于:

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

我不认为光标会在它仍然打开时知道其中一行被删除了。因此,光标不会自动从其"缓存"中自动删除已删除的行,这意味着在通过已删除的光标访问行时会出现问题。

我建议使用带有相应where子句的单个delete语句,这也有助于提高性能。

可能是这样的:查找要保留的第一行(最小rowId),即在最后一行之前位于50行的行。然后你就可以执行delete from ... where _id < minimalRowId。看看moveToPosition;然后您可以使用cursor.moveToPosition( cursor.getCount() - 50 )找到感兴趣的行。

答案 2 :(得分:0)

实际上你必须用逗号分隔的字符串传递数据,然后使用IN(] multiple ids写一些删除查询])

例如,

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