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

时间:2012-09-24 13:18:26

标签: android sqlite

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

"SELECT conn_status FROM profiles WHERE devID = '" + id+"'"

如果没有为与提供的devID相对应的'conn_status'保存值,则表中的现有值将为null。我从java中检索数据,如下所示:

c.getInt(c.getColumnIndex("conn_status"))

这里的问题是,使用给定的查询,即使字段中存在的值为null,c.getInt也会返回0。如何修改此查询,如果值为null,则返回不同的值而不是0,例如5。

感谢任何帮助。

7 个答案:

答案 0 :(得分:17)

您可以使用isNull()功能。这是一个例子:

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

答案 1 :(得分:16)

在SQLite中,您可以使用IFNULL函数替换NULL值:

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

答案 2 :(得分:3)

Java中的

int是一种原始数据类型,不能是null。因此,如果getInt没有返回值,则得0。 Integer对象可能为null,因此如果您的逻辑要求您检查空值而不是0,那么您可能需要考虑使用Integer而不是int

答案 3 :(得分:2)

如果您想要任何不同的值,如果列具有空值,则尝试使用以下代码。

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()返回某事意味着查询工作和数据库没有空值。如果返回相反意味着查询不起作用,并且数据库具有针对各个查询的空值。所以尝试一次。

答案 4 :(得分:0)

在Android中使用Integer对象不是int原语,Integer是可空的,原始int导致异常。在Model中验证value是否为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;
    }
}

答案 5 :(得分:0)

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

Integer locationInfoId;

if (cursor.getType(columnIndex) == Cursor.FIELD_TYPE_NULL){
    locationInfoId = null;
} else {
    locationInfoId = cursor.getInt(columnIndex);
}

columnIndex++;

答案 6 :(得分:0)

我在NULL来电中返回0 c.getInt(index) 值存在同样的问题。

事实证明,我的数据库的文本值为 null。也就是说,代替 NULL 的0字节值,有4个字符'n' 'u' 'l' 'l'。这很令人困惑,因为null看起来是正确的。在用SQLite数据库浏览器检查数据库之前,我没有抓住它。

当我替换这些文本值时,事情按预期工作。

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