Insertando null como valor entero en una base de datos

Estoy tratando de almacenar un valor nulo en la base de datos, pero cada vez que carga el valor obtengo 0.

Declaro el campo como " intVal integer"

Así es como lo recupero:

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

¿Es eso confiable? O es indefinido?

Así que me parece que uno no puede guardar null como un indefinido integervalue

Muchas gracias

De la documentación getInt() :

Devuelve el valor de la columna solicitada como un int. El resultado y si este método lanza 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 intervalo [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.

Todavía puede obtener el efecto que desea, sin embargo: simplemente hace 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 

SQLite se escribe de forma dinámica. Desde que definió la columna del tipo Entero y no encontró un valor que devolvió 0 basado en la sugerencia.

Intente usar String como el tipo de columna

Como mencionó Rajdeep Dua, SQLite usa una tipificación dinámica. Esto es lo que dice la documentación :

La mayoría de los motores de base de datos SQL (cada motor de base de datos SQL que no sea SQLite, por lo que sabemos) utiliza tipografía estática y rígida. Con el tipo estático, el tipo de datos de un valor está determinado por su contenedor: la columna en 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 propio valor, no con su contenedor.

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

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

Así que el código se ve así:

 Strint strVal = cursor.getInt(cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X)); if(strVal != null){ int intVal = Integer.parseInt(strVal); } 
  • RawQuery: enlace o índice de columna fuera de rango
  • Cifrar la base de datos sqlite Android:
  • Android, dos aplicaciones de una base de datos?
  • Base de datos de Android Intent
  • No se pudo leer la fila 0, col -1 de CursorWindow?
  • Base de datos local Unity SQLite
  • Comprobación de Android cuando se actualizó la última vez
  • ¿Diferencia entre las bases de datos MySQL / SQLite / etc?
  • Java.lang.StringIndexOutOfBoundsException: index = 0 length = 0 en obtener la base de datos sqlite
  • Android SQLite ON CONFLICT UPDATE es posible?
  • SQLite Database: SQLiteDiskIOException: error de E / S de disco (código 1802)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.