2012-09-24 38 views
5

A continuación se muestra la consulta que utilizo para obtener un valor int correspondiente a un campo particular en mi tabla sqlite db.Consulta Sqlite que devuelve 0 aunque el valor sea nulo

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

Si no hay ningún valor guardado para 'conn_status' correspondiente al DevID proporciona, entonces el valor existente en la tabla sería nulo. Puedo recuperar los datos desde Java como se muestra:

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

El problema aquí es, con la consulta dada, devuelve 0 c.getInt incluso si el valor existente en el campo es nulo. ¿Cómo puedo modificar esta consulta de modo que devuelva un valor diferente en lugar de 0, por ejemplo 5, si el valor es nulo?

Cualquier ayuda es apreciada.

Respuesta

15

Puede usar la función isNull(). He aquí un ejemplo:

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

Mejor práctica return Integer no primitive int y return null not -1 y control de errores en el modelo. –

3

int en Java es un tipo de datos primitivo y no puede ser null. Por lo tanto, si no hay ningún valor devuelto por su getInt, obtiene 0. El objeto Integer puede ser nulo, por lo que puede considerar usar Integer en lugar de int si su lógica requiere que compruebe nulls

16

en SQLite, puede utilizar la función de reemplazar IFNULLNULL valores:

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

en Android usan objeto Integer no int primitivo, Entero es anulable, int primitiva causa una excepción. En Model, verifique si el valor es nulo o procese el contenido.

/** 
* 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; 
    } 
} 
0

Puede saber si la columna es nula llamando a getType().

Integer locationInfoId; 

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

columnIndex++; 
2

Como desee un valor diferente como 5 si la columna tiene un valor nulo, intente con el siguiente código.

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; 
    } 

if cursor.getCount() devolver algo significa trabajo de consulta y la base de datos no tiene valor nulo. Si return opuesto significa que la consulta no funciona y databse tiene un valor nulo para la consulta respectiva. Así que pruébalo una vez.

0

he tenido el mismo problema con un NULL valor supuestamente volver 0 en una llamada c.getInt(index).

Resulta que mi base de datos tenía un valor de texto denull. Es decir, en lugar de un valor de 0 bytes de NULL, había 4 caracteres 'n' 'u' 'l' 'l'. Esto es confuso porque null parece correcto. No lo capté hasta que revisé el DB con un navegador SQLite DB.

Cuando reemplacé esos valores de texto, las cosas funcionaron como se esperaba.

Sé que esta es una pregunta antigua, pero espero que esto le ahorrará a alguien más algún tiempo para la resolución de problemas.

Cuestiones relacionadas