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

Android SQLite:如何区分字段的NULL值与0值?

如何区分SQLite中NULL值与0在Android Cursor读取时的差异

场景还原

创建students表的SQL语句:

CREATE TABLE students (name TEXT, grade INTEGER);

插入仅包含name的记录:

INSERT INTO students(name) VALUES('Allen');

此时grade字段实际值为NULL,但通过以下Android代码读取时:

Cursor cursor = database.rawQuery("SELECT grade FROM students WHERE name = 'Allen'", null);
cursor.moveToFirst();
long serverId = cursor.getLong(cursor.getColumnIndexOrThrow("grade"));
// serverId 结果为0
cursor.close();

getLong()返回0,无法直接区分是NULL还是真实的0值,可通过以下方法解决:


解决方案

1. 使用Cursor.isNull()直接判断

这是最直接可靠的方式,在调用getLong()前先检查对应列是否为NULL:

Cursor cursor = database.rawQuery("SELECT grade FROM students WHERE name = 'Allen'", null);
if (cursor.moveToFirst()) {
    int gradeColumnIndex = cursor.getColumnIndexOrThrow("grade");
    long serverId;
    if (cursor.isNull(gradeColumnIndex)) {
        // 处理NULL值的逻辑,比如设置一个业务标识值
        serverId = -1;
    } else {
        serverId = cursor.getLong(gradeColumnIndex);
    }
}
cursor.close();

2. 在SQL查询中添加NULL标记字段

通过CASE语句在查询时生成一个标记字段,明确区分NULL与0:

SELECT 
    grade,
    CASE WHEN grade IS NULL THEN 1 ELSE 0 END AS is_grade_null
FROM students 
WHERE name = 'Allen'

再在Java代码中读取标记字段判断:

Cursor cursor = database.rawQuery("SELECT grade, CASE WHEN grade IS NULL THEN 1 ELSE 0 END AS is_grade_null FROM students WHERE name = 'Allen'", null);
if (cursor.moveToFirst()) {
    int gradeColumnIndex = cursor.getColumnIndexOrThrow("grade");
    int isNullColumnIndex = cursor.getColumnIndexOrThrow("is_grade_null");
    long serverId;
    if (cursor.getInt(isNullColumnIndex) == 1) {
        // 处理NULL值
        serverId = -1;
    } else {
        serverId = cursor.getLong(gradeColumnIndex);
    }
}
cursor.close();

3. 利用getType()判断字段存储类型

Cursor.getType()会返回列的实际存储类型,NULL值对应Cursor.FIELD_TYPE_NULL:

Cursor cursor = database.rawQuery("SELECT grade FROM students WHERE name = 'Allen'", null);
if (cursor.moveToFirst()) {
    int gradeColumnIndex = cursor.getColumnIndexOrThrow("grade");
    long serverId;
    if (cursor.getType(gradeColumnIndex) == Cursor.FIELD_TYPE_NULL) {
        // 处理NULL值
        serverId = -1;
    } else {
        serverId = cursor.getLong(gradeColumnIndex);
    }
}
cursor.close();

内容的提问来源于stack exchange,提问作者L. Swifter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:17:48