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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:27:39