2011-11-09 12 views
8

Estoy tratando de almacenar un valor nulo en la base de datos pero cada vez que se carga el valor 0. consigoinsertar nulo como valor entero en una base de datos

Declaro el campo como "intVal integer"

Este es ¿Cómo puedo recuperarlo:??

Integer x; 

x = cursor.getInt(cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X)); 

¿eso es fiable o es indefinido

Así que me parece que no se puede guardar como una nula IntegerValue indefinido

Muchas gracias

Respuesta

15

De the getInt() documentation:

devuelve el valor de la columna solicitada como un int. El resultado y si este método arroja una excepción cuando el valor de la columna es nulo, el tipo de columna no es un tipo integral, o el valor entero está fuera del rango [Integer.MIN_VALUE, Integer.MAX_VALUE] está definido por la implementación.

Por lo tanto, es un detalle de implementación en el que no debe confiar.

Sin embargo, aún puede obtener el efecto que desea: simplemente realiza la comprobación nula antes de leer el valor.

int index = cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X); 
Integer x = null; 
if (!cursor.isNull(index) 
    x = cursor.getInt(index); 

// now x is either null or contains a valid value 
+0

muchas gracias ... – user387184

0

SQLite se tipea dinámicamente. Como definió la columna de tipo Entero y no encontró un valor, devolvió 0 según la sugerencia.

Trate de usar cadena como el tipo de columna

+2

¿Qué sucede si desea saber si el campo almacenado estaba vacío en lugar de cero? ¿Cómo diferencia la diferencia aquí? – Stoff81

0

Como se mencionó Rajdeep Dua, SQLite utiliza un tipado dinámico. Aquí es lo que el documentation dice:

mayoría de los motores de bases de datos SQL (todos los motores de base de datos SQL que no sea SQLite, por lo que sabemos) utiliza tipos estáticos, rígidos. Con el tipado estático de , el tipo de datos de un valor viene determinado por su contenedor: la columna particular en la que se almacena el valor.

SQLite utiliza un sistema de tipo dinámico más general. En SQLite, el tipo de datos de un valor está asociado con el valor en sí, no con su contenedor .

La documentación Android dice que el resultado de getInt() cuando el valor de la columna es null es definido por la implementación. Para mí, devuelve 0 también.

por lo que utiliza getString() lugar, aunque el resultado de este método es también definida por la implementación, para mí, devuelve null cuando el valor de la columna es null, o una cadena que contiene el número de otra manera.

Así que el código es el siguiente:

Strint strVal = cursor.getInt(cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X)); 

if(strVal != null){ 
    int intVal = Integer.parseInt(strVal); 
} 
Cuestiones relacionadas