如何通过rawQuery检查Android数据库中是否存在指定记录?
完善你的Android数据库deleteShape方法
嘿,刚上手Android数据库开发是吧?看你写了deleteShape方法的开头,想要在删除前检查数据库里有没有对应记录,我来帮你把这个方法补全并优化一下,顺便给你讲讲几个新手容易忽略的关键细节~
完整的实现代码
public boolean deleteShape(int shapeID) { boolean result = false; SQLiteDatabase db = null; Cursor mCursor = null; try { // 先获取可读数据库用于查询 db = this.getReadableDatabase(); // 检查指定shapeID的记录是否存在:用SELECT 1只判断存在性,比查全字段更高效 // 用?占位符+参数数组,避免SQL注入风险,这是Android数据库操作的最佳实践 mCursor = db.rawQuery( "SELECT 1 FROM shapes WHERE id = ?", new String[]{String.valueOf(shapeID)} ); // 如果Cursor能移动到第一行,说明有对应记录 if (mCursor.moveToFirst()) { // 切换为可写数据库执行删除操作 db = this.getWritableDatabase(); // delete方法返回删除的行数,大于0说明删除成功 int deletedRows = db.delete( "shapes", "id = ?", new String[]{String.valueOf(shapeID)} ); result = deletedRows > 0; } } catch (Exception e) { // 捕获异常避免崩溃,开发阶段可以打印日志排查问题 e.printStackTrace(); } finally { // 必须在finally块关闭Cursor和Database,防止内存泄漏 if (mCursor != null) { mCursor.close(); } if (db != null && db.isOpen()) { db.close(); } } return result; }
新手必看的关键细节
- 防SQL注入:绝对不要直接把
shapeID拼进SQL字符串里,用?占位符配合参数数组的方式,能避免恶意输入导致的安全问题。 - 资源释放:
Cursor和SQLiteDatabase都是占用系统资源的对象,一定要在finally块里关闭,不管操作成功还是失败,都能保证资源被回收,避免内存泄漏。 - 查询优化:检查记录是否存在时,用
SELECT 1代替SELECT *,因为我们只需要知道有没有记录,不需要获取所有字段,这样查询速度更快,占用资源更少。 - 数据库读写切换:查询操作用可读数据库就够了,删除操作需要可写数据库,代码里做了对应的切换,保证操作权限正确。
另外给你个小补充:如果你的shapes表的id是主键(也就是shapeID对应主键),其实也可以不用提前查询——delete方法返回的删除行数如果是0,就说明没有对应记录。不过既然你明确要求删除前先检查,上面的代码完全满足你的需求~
内容的提问来源于stack exchange,提问作者user9535888
相关产品推荐
相关产品推荐

