Android SQLite应用删除ListView条目时崩溃问题求助
Android SQLite删除条目崩溃问题修复
问题根源
- SQL语法错误:
DELETE FROM后缺少空格,拼接后的SQL语句会变成DELETE FROM[表名]...,属于无效语法,直接触发SQL异常导致崩溃。 - 错误使用rawQuery:
rawQuery仅适用于查询操作(SELECT),执行DELETE这类修改操作应该用execSQL或系统提供的delete()方法,用rawQuery执行修改会引发异常。 - 资源泄漏风险:未关闭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
相关产品推荐
相关产品推荐

