Android中SQLite如何查询整数列(布尔型)判断0或1
解决SQLite整数布尔列的查询问题
我来帮你搞定这个问题!你的代码现在有几个核心问题,导致它不管查询结果如何都会返回true——你既没正确处理rawQuery返回的Cursor,也没给查询的占位符传值,而且直接硬返回true,完全没用到数据库的查询结果。
咱们一步步来修正:
原代码的问题点
- 你在SQL语句里用了占位符
?,但rawQuery的第二个参数传了null,这会导致查询条件不生效,数据库不知道你要匹配什么值 - 没有读取
rawQuery返回的Cursor数据,直接返回true,等于完全忽略了查询结果 - 没有关闭数据库和Cursor,会造成资源泄漏,这在Android开发里是要避免的
正确的实现方式(用Cursor处理查询结果)
下面是调整后的代码,我会加上注释说明每个步骤:
public boolean getLucide(int recordId) { // 假设你需要根据记录ID查询特定行的lucidite值,可根据你的实际需求修改查询条件 SQLiteDatabase db = null; Cursor cursor = null; try { // 获取可读数据库实例 db = this.getReadableDatabase(); // 定义查询语句,这里用ID作为查询条件,你可以换成自己需要的条件(比如日期、其他字段) String query = "SELECT luciditeCarnetreve FROM Carnetreve WHERE id = ?"; // 执行查询,把占位符的参数传入(注意要转成String数组) cursor = db.rawQuery(query, new String[]{String.valueOf(recordId)}); // 判断Cursor是否有数据,如果有就移动到第一条记录 if (cursor.moveToFirst()) { // 获取对应列的整数值,getColumnIndexOrThrow可以避免列名写错的问题 int lucidValue = cursor.getInt(cursor.getColumnIndexOrThrow("luciditeCarnetreve")); // 把整数转换成boolean:1对应true,0对应false return lucidValue == 1; } else { // 如果没找到对应的记录,返回默认值(这里返回false,你可以根据业务调整) return false; } } finally { // 不管查询成功还是失败,都要关闭Cursor和数据库,释放资源 if (cursor != null) { cursor.close(); } if (db != null) { db.close(); } } }
关键注意点
- Cursor的处理:
rawQuery返回的Cursor默认是在数据的前一个位置,必须调用moveToFirst()(或者moveToNext())才能读取数据 - 占位符参数:如果你的查询条件是其他值(比如要直接查询lucidite为1的记录),可以修改SQL语句和参数数组,比如
String query = "SELECT luciditeCarnetreve FROM Carnetreve WHERE luciditeCarnetreve = ?";,然后参数传new String[]{"1"} - 资源释放:一定要在finally块里关闭Cursor和数据库,或者用Android的
try-with-resources语法(API 19+支持),防止内存泄漏 - 列名安全:用
getColumnIndexOrThrow代替getColumnIndex,如果列名写错会直接抛出异常,方便你排查错误
如果你的需求是判断数据库中是否存在luciditeCarnetreve为1的记录,可以简化查询语句为:
String query = "SELECT EXISTS(SELECT 1 FROM Carnetreve WHERE luciditeCarnetreve = 1)"; // 执行查询后获取结果 int exists = cursor.getInt(0); return exists == 1;
这样就能准确获取到你要的布尔值结果啦!
内容的提问来源于stack exchange,提问作者M. Dupont
相关产品推荐
相关产品推荐

