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"
- ¿Dónde puedo encontrar el archivo predeterminado Realm Database
- Consulta de actualización de base de datos SQLite con múltiples condiciones de ubicación en Android
- intento de escribir una base de datos readonly en android
- La manera más rápida y eficiente de pre-poblar la base de datos en Android
- ¿Cómo comprobar si el valor ya existe en la base de datos android sqlite?
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
- Sugerencias sobre cómo guardar datos
- Ventana del cursor: la ventana está llena
- Una solución en la nube para sincronizar la base de datos de aplicaciones en Android
- Base de datos SQLite de Android, ¿POR QUÉ caída de tabla y volver a crear en la actualización
- ¿Qué es una clase completa de ayuda de base de datos Android para una base de datos SQLite existente?
- Android, Diacritic Insensitive SQLite Búsqueda
- Manejo de errores SQLException en android
- Cómo importar db a sqlite pre-fabricados administrado por ormlite
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); }
- En Android XML, ¿puedo establecer buttonStyleSmall o Button.Small como un estilo padre para un estilo personalizado?
- Uso del calendario para determinar las fechas de AM o PM