You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:18:07