Cómo obtener entradas nulas de sqlite en android

Tengo un problema que de hecho puede ser un problema de diseño, pero estoy luchando para encontrar una manera de evitarlo.

En mi base de datos sqlite en mi aplicación Android, tengo una tabla llamada Customer . Esto tiene alrededor de 40 columnas de varios tipos de datos string e int. En la práctica, cualquiera de estas columnas puede o no ser nula.

En mi código, tengo una función simplemente llamada getCustomer() , que consulta la base de datos para un cliente específico, y coloca todas sus celdas de la base de datos en una clase Customer , que contiene variables para cada columna. Puedo entonces pasar ese objeto del cliente alrededor como deseo. La función getCustomer() devuelve este objeto Customer .

Mi problema es enteros que pueden ser nulos. Estoy familiarizado con cómo int no puede ser nulo en java, pero cómo Integer puede ser nulo. Pero mi problema radica en el hecho de que las celdas de la base de datos pueden estar vacías (por ejemplo, null).

Para las columnas de cadenas, simplemente hago esto:

 Customer cust = new Customer(); cust.firstName = cursor.getString(0); 

Si cursor.getString(0); Devuelve un valor nulo, entonces la variable firstName se asigna null. Bonito y simple. Sin embargo, con un int:

 Customer cust = new Customer(); cust.daysSinceJoining = cursor.getInt(5); 

El anterior se bloquea en tiempo de daysSinceJoining si daysSinceJoining es nulo. Así que probé lo siguiente:

 Customer cust = new Customer(); if (cursor.getInt(5) != null) cust.daysSinceJoining = cursor.getInt(5); 

Sin embargo, esto me da un error de compilador, ya que no se puede utilizar un int en una comparación nula como esa.

¿Cómo puedo solucionar este problema? ¿Cómo puedo recuperar un int de una base de datos sqlite cuando el valor int podría ser nulo?

Puede probar la función isNull() .

@sanders tiene razón sobre el método isNull() y aquí es cómo editas tu código para usarlo:

 Customer cust = new Customer(); if (!cursor.isNull(5)) cust.daysSinceJoining = cursor.getInt(5); 

Por favor, eche un vistazo a esa respuesta:

Restricciones null de getInt

Creo que debería funcionar para usted:

 int lIndex = cursor.getColumnIndexOrThrow(COLUMN); Integer lInteger = null; if (!cursor.isNull(lIndex) lInteger = cursor.getInt(lIndex); 

Puede crear un contenedor de cursor y agregar nueva funcionalidad a la clase de cursor:

 public class CustomCursor extends CursorWrapper { public CustomCursor(Cursor cursor) { super(cursor); } //simple constructor public Integer getInteger(int columnIndex) { // new method to return Integer instead of int if (super.isNull(columnIndex)){ return null; }else{ return super.getInt(columnIndex); } } } 

Ejemplo de uso:

 Cursor defaultCursor = db.rawQuery("select null,2 ", null); defaultCursor.moveToFirst(); CustomCursor customCursor = new CustomCursor(defaultCursor); customCursor.moveToFirst(); //custom cursor can do anything that default cursor can do int defaultInt0 = defaultCursor.getInt(0); //nulls are usually converted into zero int defaultInt1 = defaultCursor.getInt(1); //2 is correct int customInt0 = customCursor.getInt(0); //these 2 are same as above , ie zero and 2 int customInt1 = customCursor.getInt(1); Integer customInteger0 = customCursor.getInteger(0); // this will give a null Integer Integer customInteger1 = customCursor.getInteger(1); // this will give a 2 Integer Log.v("custom log.v call ", "lets see what outputs, null is usually converted to the word 'null' by the String.valueOf method :" +String.valueOf(defaultInt0)+","+String.valueOf(defaultInt1)+"," +String.valueOf(customInt0)+","+String.valueOf(customInt1)+"," +String.valueOf(customInteger0)+","+String.valueOf(customInteger1) ); //V: lets see what outputs, null is usually converted to the word 'null' by the String.valueOf method :0,2,0,2,null,2 

If (cursor.getInt (5)! = 0) {

 cust.daysSinceJoining = cursor.getInt(5); 

}

o

 int index = cursor.getColumnIndex(KEY_NAME); Integer x = null; if (!cursor.isNull(index) cust.daysSinceJoining = cursor.getInt(5); } 

Consulte la documentación documentación getInt ():

  • Actualización de Android SQLite sin perder datos
  • Android Jelly bean base de datos está bloqueado (código 5)
  • La lectura de cadena gzip en sqlite3 base de datos (python escribir, Java Android leer)
  • Problema de almacenamiento de datos de Android
  • Android - CursorLoader y SQLite sin proveedor de contenido
  • Cómo utilizar Berkeley DB SQL API en Android
  • Mantener los datos SQLite después de la actualización
  • SQLite "INSERT OR REPLACE INTO" no funciona
  • Nuevo carácter de línea \ n no se muestra correctamente en textView Android
  • SQLCipher - Abrir una base de datos cifrada en el escritorio
  • Implementación SQLite deficiente? Acceso a los datos por primera vez demasiado lento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.