Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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).

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?

  • Actualización de Android SQLite sin perder datos
  • SQLite Android: parámetro nullColumnHack en los métodos insert / replace
  • Mantenimiento de un ListView donde cada elemento de lista tiene una relación de uno a muchos
  • Cursor de Android con ORMLite para usar en CursorAdapter
  • No se puede degradar la base de datos de la versión 2 a 1 incluso después de una nueva instalación y volver a ejecutar
  • Cuente el número de tablas en la base de datos sqlite
  • Seguridad de base de datos Sqlite
  • Buscar datos en la base de datos SQLite de Android
  • 6 Solutions collect form web for “Cómo eliminar filas en SQLite con múltiples args donde?”

    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); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.