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

Android SQLite应用删除ListView条目时崩溃问题求助

Android SQLite删除条目崩溃问题修复

问题根源

  1. SQL语法错误:DELETE FROM后缺少空格,拼接后的SQL语句会变成DELETE FROM[表名]...,属于无效语法,直接触发SQL异常导致崩溃。
  2. 错误使用rawQuery:rawQuery仅适用于查询操作(SELECT),执行DELETE这类修改操作应该用execSQL或系统提供的delete()方法,用rawQuery执行修改会引发异常。
  3. 资源泄漏风险:未关闭Cursor,即便语句能执行,也会造成数据库资源泄漏。

修正后的DatabaseHelper.deleteOne方法

推荐使用两种更安全的实现方式:

方式一:参数化execSQL(避免SQL注入)

public boolean deleteOne(CustomerModel customerModel){
    SQLiteDatabase db = this.getWritableDatabase();
    try {
        // 注意FROM后加空格,同时用参数化查询避免注入
        String queryString = "DELETE FROM " + CUSTOMER_TABLE + " WHERE " + COLUMN_ID + " = ?";
        db.execSQL(queryString, new Object[]{customerModel.getId()});
        return true;
    } catch (SQLException e) {
        e.printStackTrace();
        return false;
    } finally {
        db.close();
    }
}

方式二:使用SQLiteDatabase内置delete方法(Android推荐)

public boolean deleteOne(CustomerModel customerModel){
    SQLiteDatabase db = this.getWritableDatabase();
    String whereClause = COLUMN_ID + " = ?";
    String[] whereArgs = {String.valueOf(customerModel.getId())};
    // delete方法返回删除的行数,大于0则说明删除成功
    int deletedRows = db.delete(CUSTOMER_TABLE, whereClause, whereArgs);
    db.close();
    return deletedRows > 0;
}

额外优化(可选)

MainActivity中每次删除后重建Adapter的写法可以优化为更新现有Adapter的数据后调用notifyDataSetChanged(),减少不必要的对象创建:

private void extracted(DataBaseHelper dataBaseHelper) {
    // 如果Adapter已初始化,直接更新数据
    if (customerArrayAdapter != null) {
        customerArrayAdapter.clear();
        customerArrayAdapter.addAll(dataBaseHelper.getEveryone());
        customerArrayAdapter.notifyDataSetChanged();
    } else {
        customerArrayAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, dataBaseHelper.getEveryone());
        lv_customerList.setAdapter(customerArrayAdapter);
    }
}

内容的提问来源于stack exchange,提问作者Binari Dissanayake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:00:19