数据库无法删除及预新增数据前清空数据库的代码问题咨询
问题排查与修复方案
我一眼就看到了问题的核心——你的事务处理逻辑有疏漏,导致删除操作根本没被提交到数据库!
核心问题:事务未标记为成功
SQLite 的事务机制默认是回滚模式:如果在调用 endTransaction() 之前没有调用 setTransactionSuccessful(),所有在事务内的操作都会被撤销。你的代码里只执行了 delete,但没标记事务成功,所以删除操作相当于白做了,旧数据自然还留在库里。
修复后的完整代码
我帮你调整了事务逻辑,同时优化了代码的可读性:
private Cursor getAllPlayers(){ try { playerDatabase.beginTransaction(); // 执行全表删除 int deletedRows = playerDatabase.delete( PlayerDetails.PlayerTableEntry.TABLE_NAME, null, null ); // 标记事务成功,确保删除操作被提交 playerDatabase.setTransactionSuccessful(); Log.d("DB_OP", "Deleted " + deletedRows + " rows from player table"); } catch (SQLException e){ // 捕获异常时打印日志,方便排查问题 e.printStackTrace(); } finally { // 结束事务:如果之前标记了成功就提交,否则自动回滚 playerDatabase.endTransaction(); } // 新增数据到数据库 playerDatabase = ComposeMessage.addPlayerToTheDatabase(playerDatabase, playerDataSet); // 查询并返回结果(补全你原来的排序字段) return playerDatabase.query( PlayerDetails.PlayerTableEntry.TABLE_NAME, null, null, null, null, null, PlayerDetails.PlayerTableEntry.COLUMN_NAME // 替换为你实际的排序字段 ); }
额外注意事项
- 确认
PlayerDetails.PlayerTableEntry.TABLE_NAME的拼写完全正确,避免因为表名错误导致删除失败 - 确保
playerDatabase是可写数据库实例(比如通过getWritableDatabase()获取),只读实例无法执行删除操作 - 可以通过
delete()方法的返回值(删除的行数)判断操作是否生效,方便调试排查
内容的提问来源于stack exchange,提问作者user9607849
相关产品推荐
相关产品推荐

