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.
- Prueba de Android JUnit para SQLiteOpenHelper
- NoClassDefFoundError al usar greenDao
- No es posible obtener datos de la base de datos Sqlite
- SQLiteDatabase.openDatabase vs SQLiteOpenHelper.getReadableDatabase
- Android - cómo utilizar "select last_insert_rowid ();"
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?
- Android - ¿Puedes actualizar un Cursor para los resultados de SQLite?
- RawQuery: enlace o índice de columna fuera de rango
- Base de datos no visible en la carpeta DDMS cuando se utiliza el dispositivo real en lugar del emulador
- Copiar mi propio DB de SQLite de la carpeta de activos a
- Acceso a la base de datos sqlite en el dispositivo android
- Usando la función strftime de sqlite en android
- ¿Necesito un proveedor de contenido con un cargador de cursor?
- Ejemplo de búsqueda de texto completo en Android
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 ():
- Desactivar el botón "ATRÁS" en Android?
- ¿Cómo puedo obtener una lista de directorios de recursos de mi aplicación para Android?