Selección de valores NULL en Android SQLite
Estoy ejecutando el siguiente método sin éxito debido a que el selectArgs es incorrecto (al menos esto es lo que creo.
Encuentra todos:
- SQLite en Android Cómo actualizar una fila específica
- ¿Debo usar siempre transacciones en android sqlite?
- ¿Qué técnica de almacenamiento de datos Android utilizar?
- Cambiar la profundidad de bits de Bitmap
- Prácticas recomendadas para sincronizar una base de datos SQL con un servidor remoto REST en Android
public Collection<Object> findAllByCodigoSetorOrderByStatusWhereDataAgendamentoIsNull(Integer vendedor) { Collection<Object> objects = null; String selection = Object.FIELDS[20] + "=?" + " OR " + Object.FIELDS[20] + "=?" + " OR " + Object.FIELDS[20] + "=?" + " AND " + Object.FIELDS[6] + "=?"; String[] selectionArgs = new String[] { "''", "'null'", "NULL", String.valueOf(vendedor) }; Collection<ContentValues> results = findAllObjects(Object.TABLE_NAME, selection, selectionArgs, Object.FIELDS, null, null, Object.FIELDS[4]); objects = new ArrayList<Object>(); for (ContentValues result : results) { objects.add(new Object(result)); } return objects; }
FindAllObjects:
protected Collection<ContentValues> findAllObjects(String table, String selection, String[] selectionArgs, String[] columns, String groupBy, String having, String orderBy) { Cursor cursor = null; ContentValues contentValue = null; Collection<ContentValues> contentValues = null; try { db = openRead(this.helper); if (db != null) { cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy); contentValues = new ArrayList<ContentValues>(); for (int i = 0; i < cursor.getCount(); i++) { cursor.moveToPosition(i); contentValue = new ContentValues(); for (int c = 0; c < cursor.getColumnCount(); c++) { contentValue.put(cursor.getColumnName(c), cursor.getString(c)); } contentValues.add(contentValue); cursor.moveToNext(); } } return contentValues; } finally { close(db); } }
¿Cómo puedo seleccionar correctamente y comparar una columna a – null, 'null' y '' usando db.query?
- Sqlite Comprobar si la tabla está vacía
- SQlite - Android - Sintaxis de clave extranjera
- CursorLoader, obtiene URI para la base de datos local
- Cómo evitar objetos duplicados en la base de datos DB4o
- Opciones de SyncAdapter
- Error al leer la fila 0, columna 0 de una CursorWindow que tiene 0 filas, 64 columnas
- Android y SQLite - recupera el ID máximo de la tabla
- Se eliminó la base de datos de Sqlite cuando borro datos de la aplicación
La API de la base de datos de Android no permite pasar valores NULL
como parámetros; Sólo permite cadenas. (Esto es un error de diseño horrible, peor aún, SQLiteStatement no permite que todos los tipos de parámetros, pero sólo funciona para las consultas que devuelven un único valor.)
No tienes otra opción que cambiar la cadena de consulta a blah IS NULL
.
La vieja pregunta pero todavía estaba atascado en esto por algunas horas hasta que encontré esta respuesta. Por alguna razón este comportamiento extraño (o error) todavía existe dentro del androide sdk, si desea consultar contra valores nulos simplemente hacer
SQLiteDatabase db = getReadableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("columnName", newValue); String nullSelection = "columnName" + " IS NULL"; db.update("tableName", contentValues, nullSelection, null); db.close();
En este ejemplo estoy actualizando valores, pero es un concepto similar cuando sólo se seleccionan valores
Como se menciona en otras respuestas, para nulo "IS NULL" debe utilizarse. He aquí un código de conveniencia para tener tanto null como strings (estoy usando delete en el ejemplo pero lo mismo se puede hacer para otros métodos, por ejemplo query):
public void deleteSomething(String param1, String param2, String param3) { ArrayList<String> queryParams = new ArrayList<>(); mDb.delete(TABLE_NAME, COLUMN_A + getNullSafeComparison(param1, queryParams) + "AND " + COLUMN_B + getNullSafeComparison(param2, queryParams) + "AND " + COLUMN_C + getNullSafeComparison(param3, queryParams), queryParams.toArray(new String[0])); } private String getNullSafeComparison(String param, List<String> queryParams) { if (param == null) { return " IS NULL "; } else { queryParams.add(param); return " = ? "; } }