Android中SQLite删除players表行失败,求解决方法
嘿,我一眼就看到问题所在啦!你现在犯了一个很容易踩的小坑——把ListView的**位置索引(position)**当成了数据库里的玩家ID来用,这就导致数据库根本找不到要删除的行呀!
具体问题分析
在你的removeItemFromList方法里,你调用dbh.deletePlayer(String.valueOf(deletePosition)),这里的deletePosition是列表项在ListView中的位置,而不是数据库表中玩家对应的真实ID。数据库的players表是通过id字段来匹配行的,用列表位置去匹配,自然找不到对应的记录,删除操作就会返回0,也就是失败。
修复步骤
1. 获取玩家的真实ID
首先你需要从你的数据源(playerNameArrayList)中拿到对应位置玩家的真实数据库ID。这里分两种情况:
如果你的列表存的是自定义Player对象(推荐这种更规范的方式):
假设你的Player类定义如下:public class Player { private String id; // 数据库中的玩家ID private String name; // 玩家名称 // 构造方法、getter/setter省略 public String getId() { return id; } }那在删除时,先获取对应位置的Player对象,再拿到它的真实ID:
Player targetPlayer = playerNameArrayList.get(deletePosition); String realPlayerId = targetPlayer.getId();如果你的列表只存了玩家名称,还有单独的ID列表:
比如你有一个playerIdArrayList专门存储数据库ID,那就直接取对应位置的ID:String realPlayerId = playerIdArrayList.get(deletePosition);
2. 用真实ID调用删除方法
把刚才拿到的realPlayerId传给deletePlayer,替换原来的String.valueOf(deletePosition):
if (dbh.deletePlayer(realPlayerId) > 0) { Toast.makeText(ManagePlayers.this, "Player Deleted", Toast.LENGTH_LONG).show(); finish(); } else { Toast.makeText(ManagePlayers.this, "Player NOT Deleted", Toast.LENGTH_LONG).show(); }
3. 优化列表更新代码
另外,列表更新只需要调用myArrayAdapter.notifyDataSetChanged()就足够了,notifyDataSetInvalidated()是在数据集完全失效(比如整个数据源被清空重建)时才需要用的,这里可以删掉:
playerNameArrayList.remove(deletePosition); myArrayAdapter.notifyDataSetChanged(); // 删掉这一行:myArrayAdapter.notifyDataSetInvalidated();
额外检查点
如果按照上面的步骤改完还是不行,可以检查一下:
- 数据库中
players表的id字段类型是否和你传入的realPlayerId类型匹配(比如如果数据库里是整数类型,确保传入的字符串是合法数字); - 确认
playerNameArrayList中的数据和数据库中的数据是完全同步的,没有出现数据不一致的情况。
内容的提问来源于stack exchange,提问作者user3111329

