Android 即使值为null,Sqlite查询仍返回0

Android 即使值为null,Sqlite查询仍返回0,android,sqlite,Android,Sqlite,下面是我用来获取对应于sqlite db表中特定字段的int值的查询 "SELECT conn_status FROM profiles WHERE devID = '" + id+"'" 如果没有为所提供的设备对应的“conn_status”保存值,则表中的现有值将为null。我从java检索数据,如图所示: c.getInt(c.getColumnIndex("conn_status")) 这里的问题是,对于给定的查询,即使字段中存在的值为null,c.getInt也返回0。如何修改此查

下面是我用来获取对应于sqlite db表中特定字段的int值的查询

"SELECT conn_status FROM profiles WHERE devID = '" + id+"'"
如果没有为所提供的设备对应的“conn_status”保存值,则表中的现有值将为null。我从java检索数据,如图所示:

c.getInt(c.getColumnIndex("conn_status"))
这里的问题是,对于给定的查询,即使字段中存在的值为null,c.getInt也返回0。如何修改此查询,使其在值为null时返回不同的值,而不是0(例如5)


非常感谢您的帮助。

您可以使用
isNull()
函数。下面是一个例子:

static int getInt(String columnName)
{
    if(c.isNull(c.getColumnIndex(columnName)))
        return -1;
    return c.getInt(c.getColumnIndex(columnName));
}

Java中的
int
是基本数据类型,不能为
null
。因此,如果getInt没有返回值,则得到0。
整数对象可能是NULL,所以您可能需要考虑使用整数而不是int,如果您的逻辑需要检查空值,而不是在SQLite中使用0的

< P>,则可以使用该函数替换<代码> null 值:

SELECT IFNULL(conn_status, 5) FROM profiles WHERE devID = ?

在Android中,使用整型对象而不是整型原语,整型可为空,原语整型导致异常。在模型中验证值是否为null或处理内容

/**
 * Return real integer of value or null
 * @param column_name Name of column in result
 */
public Integer getInt(String column_name){
    try{
        if(cursor.isNull(cursor.getColumnIndex(column_name)))
            return null;
        return cursor.getInt(cursor.getColumnIndex(column_name));
    }catch(Exception e){
        e.printStackTrace();
        Log.e("sqlite_exception", "column " + column_name + " not exists. " + e.getMessage());
        return null;
    }
}

可以通过调用getType()来判断列是否为null


由于您需要任何不同的值,如5,若列具有空值,请尝试以下代码

Cursor c = db.rawQuery("SELECT conn_status FROM profiles WHERE devID = '" + id+"'");

    if(c.getCount>0){
    int number = c.getInt(c.getColumnIndex(conn_status));
    return number;
    }else{
    return 5;
    }

如果cursor.getCount()返回某个值,则表示查询工作和数据库没有空值。若返回相反的值,则表示查询不起作用,并且数据库的相应查询值为空。所以试一下。

c.getInt(index)
调用中,我遇到了一个假定为
NULL
的值返回
0
的问题

结果表明,我的数据库的文本值为
null
。也就是说,不是0字节的值
NULL
,而是4个字符
'n''u''l''l'
。这令人困惑,因为
null
看起来是正确的。直到我用SQLite数据库浏览器检查了数据库,我才捕捉到它

当我替换这些文本值时,一切都如期进行


我知道这是一个老问题,但希望这能为其他人节省一些故障排除时间。

更好地练习返回整数非原语int和返回null非-1,并控制模型中的错误。
Cursor c = db.rawQuery("SELECT conn_status FROM profiles WHERE devID = '" + id+"'");

    if(c.getCount>0){
    int number = c.getInt(c.getColumnIndex(conn_status));
    return number;
    }else{
    return 5;
    }