Android开发:如何检查数据库中是否存在指定行?
检查数据库中号码是否存在的最优方式
嘿,我来帮你梳理下问题所在以及最优解决方案:
首先,你的代码之所以总是返回true,核心原因是判断逻辑出错了——player.getCount() >= 0这个条件永远成立,因为Cursor的getCount()返回的是结果集行数,最小值就是0,不管有没有匹配的号码,这个判断都会为true,自然方法一直返回true。
接下来给你从修复到优化的几个方案:
1. 先修复现有代码的判断逻辑
把判断条件改成player.getCount() > 0,这样只有查询到至少一行数据时才返回true:
Cursor player = playerDatabase.rawQuery("select * from playerTable where playerNumber ="+number,null); try { return player.getCount() > 0; } finally { if(player != null){ player.close(); } }
不过这里要注意:直接把number拼接到SQL语句里存在SQL注入风险,如果number是恶意构造的内容,可能会破坏你的数据库,所以不推荐这种写法。
2. 改用参数化查询(更安全)
用?作为占位符,通过参数传递number,彻底避免SQL注入问题:
Cursor player = playerDatabase.rawQuery( "select * from playerTable where playerNumber = ?", new String[]{String.valueOf(number)} ); try { return player.getCount() > 0; } finally { if(player != null){ player.close(); } }
3. 最优实现:使用EXISTS查询(性能更高)
上面的查询会返回匹配行的所有列,但我们其实只需要知道“是否存在”,不需要实际的数据。用EXISTS子查询可以让数据库只检查是否有匹配项,不需要返回具体内容,性能会更优:
Cursor cursor = playerDatabase.rawQuery( "SELECT EXISTS(SELECT 1 FROM playerTable WHERE playerNumber = ?)", new String[]{String.valueOf(number)} ); try { cursor.moveToFirst(); return cursor.getInt(0) == 1; } finally { if(cursor != null){ cursor.close(); } }
这里EXISTS会返回1(存在匹配)或0(不存在),我们只需要移动到结果的第一行,取第一列的值判断就行。
另外,如果你的项目用了Room(Android官方的ORM框架),写法会更简洁,不需要手动处理Cursor:
@Query("SELECT EXISTS(SELECT 1 FROM playerTable WHERE playerNumber = :number)") boolean isPlayerNumberExists(int number);
直接调用这个DAO方法就可以,Room会自动帮你处理资源关闭、线程安全等问题。
内容的提问来源于stack exchange,提问作者user9784266
相关产品推荐
相关产品推荐

