Cómo eliminar filas en SQLite con múltiples args donde?
Quiero eliminar filas que satisfacen cualquiera de las condiciones múltiples.
Por ejemplo, pasar una lista de ID, y quiero eliminar todas las filas con estos IDs
(IDs son únicos).
- SQLite de SQL INSERT o IGNORE no funciona
- ¿Qué podría estar causando este SQLite CursorWindowAllocationException?
- Cómo obtener ArrayIndex fuera de límites Excepción al agregar nuevos elementos a la lista mientras se desplaza
- Aplicación detenida en Android / SQLITE ERROR /
- ¿Hay alguna forma de implementar la búsqueda de texto completo (FTS) en SQlite de la plataforma Android?
Esto sería:
String[] ids = {"0", "1", "2", "3",...}; database.delete("rows" , "id=? OR id=? OR id=? OR id=? OR ..." , ids );
¿Hay alguna manera de hacerlo compacto sin OR
múltiple?
- RealmObject AND Parcelable
- Podemos usar truncar consulta en android sqlite
- ¿Cómo puedo comprobar si mi tabla sqlite contiene datos?
- Db-shm y db-wal en bases de datos sqlite
- SQLITE - eliminar filas con join interno?
- La aplicación se bloquea si el cursor SQLite no tiene resultados
- Utilizar la instrucción LIMIT en una consulta SQLite
- Android: Guardando valores booleanos en una base de datos (Principiante)
Puede obtenerlo a través del método db.execSQL
y la palabra clave IN de SQL. Por ejemplo:
String args = TextUtils.join(", ", ids); db.execSQL(String.format("DELETE FROM rows WHERE ids IN (%s);", args));
Lo que usted quiere utilizar es una cláusula IN
, algo así como (con 4 ID);
database.delete("rows", "id IN (?, ?, ?, ?)", ids );
A petición, este es (un ejemplo de) cómo puede hacerlo dinámicamente;
database.delete("rows", "id IN (" + new String(new char[ids.length-1]).replace("\0", "?,") + "?)", ids);
La documentación oficial de Android dice aquí que el uso de execSQL no es la forma correcta de eliminar registros.
Me gustaría sugerir el siguiente método simple. Uso de delete()
api.
String[] idArray = new String[] {"1", "2", "3"}; String idsCSV = TextUtils.join(",", idArray); SQLiteDatabase db = getWritableDatabase(); if (db != null) { db.delete("table_name", "id IN (" + idsCSV + ")", null); db.close(); }
He hecho esto usando esto:
Sqlite Statement Sintaxis:
db.delete(TABLE_NAME,"COLUMN IN (?)", new String[]{commaSaparatedString})
Ejemplo basado en la pregunta:
String args = TextUtils.join(", ", ids); db.delete("rows","id IN (?)", new String[]{args})
Puede usar id IN (1, 2, 3, 4, ...)
e imprimir directamente los valores de matriz dentro de los corchetes:
database.delete("rows", String.format("id IN (%s)", StringUtils.join(ids, ",")));
Como alternativa, intentaría usar algún tipo de columna de flags
para esas cosas (si hay algo como ser capaz de marcar entradas únicas para borrar, no sé cómo se construye su lista de ID).
He aquí un ejemplo que construye la cadena de marcador de posición "?,?,?, …" con StringBuilder. Si hay muchos parámetros, la concatenación de cadena simple crearía mucha basura, StringBuilder ayuda con eso.
String[] ids = {"0", "1", "2", "3",...}; StringBuilder placeholders = new StringBuilder(); for (int i = 0; i < ids.length; i++) { if (i != 0) placeholders.append(", "); placeholders.append("?"); } String where = "id IN (" + placeholders.toString() + ")"; db.delete("rows", where, args);
- Cómo establecer la hora del dispositivo mediante programación
- Android – java.lang.IllegalArgumentException: contentIntent error requerido por la notificación?