早上好,我在尝试从我的数据库同时删除多行时遇到了一些问题。当我调试应用程序时抛出异常(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();
}
});
答案 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")