Eliminar varias filas en SQLITE (android)

Quiero eliminar todas las filas de la tabla que coinciden con los identificadores de una matriz. Puedo hacer eso por cualquiera de los siguientes 2 métodos (ambos están trabajando). ¿Puede aconsejar por favor cuál es mejor?

MÉTODO 1:

public void deleteRec(String[] ids) { //ids is an array SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_NAME, KEY_ID+" IN (" + new String(new char[ids.length-1]).replace("\0", "?,") + "?)", ids); db.close(); } 

MÉTODO 2:

 public void deleteRec(String[] ids) { //ids is an array String allid = TextUtils.join(", ", ids); SQLiteDatabase db = this.getWritableDatabase(); db.execSQL(String.format("DELETE FROM "+TABLE_NAME+" WHERE "+KEY_ID+" IN (%s);", allid)); db.close(); } 

Sólo olvidarse del segundo método!

Sus ids son todas cadenas de números (de lo contrario SQL fallaría), pero para los datos de cadena genéricos, pasar datos en sentencias SQL nunca es una buena idea. Hacer su aplicación vulnerable a la inyección de SQL:

 String.format("DELETE FROM t WHERE ID='%s', "1' AND 1=1 --") // = "DELETE FROM t WHERE ID='1' AND 1=1 --'" => would delete all data! 

Y puede fallar sus instrucciones SQL:

 String.format("DELETE FROM t WHERE v='%s', "It's me!") // = "DELETE FROM t WHERE v='It's me!'" => syntactically incorrect (quote not escaped)! 

EDIT: Como ids se suministran como matriz de cadena y probablemente KEY_ID refiere a una columna INT , el método 1 debe adaptarse a:

 db.delete(TABLE_NAME, "CAST("+KEY_ID+" AS TEXT) IN (" + new String(new char[ids.length-1]).replace("\0", "?,") + "?)", ids); 

Pruebe este maybye que le ayuda:

 String[] Ids = ......; //Array of Ids you wish to delete. String whereClause = String.format(COL_NAME + " in (%s)", new Object[] { TextUtils.join(",", Collections.nCopies(Ids.size(), "?")) }); db.delete(TABLE_NAME, whereClause, Ids); 

Lea esta documentación dice que no debe usar execSQL con INSERT, DELETE, UPDATE o SELECT porque puede ser un riesgo potencial de seguridad. Y todavía creo que con respecto al rendimiento de la primera es mejor.

prueba esto

 public void deleteRec(String[] ids) { //ids is an array SQLiteDatabase db = this.getWritableDatabase(); for (int i = 0; i < ids.length; i++) { //Your code for delete } db.close(); } 
  • SQLite obtener todos los datos y pasarlo a un adaptador
  • El uso de selectArgs no funciona en una consulta
  • ¿Cómo puedo obtener información sobre la columna causó restricción de clave externa en android sqlite?
  • Android desventajas de no cerrar el cursor
  • El ejemplo de NotesDbAdapter es para una tabla, ¿qué hay de varias tablas?
  • Cómo probar la actualización de la base de datos sqlite antes de cargar la nueva versión de mi aplicación en la tienda de juegos en android
  • Net.sqlcipher.database.SQLiteException: no es un error:
  • Error de SQLiteOpenHelper
  • Base de datos de exportación de importación android
  • ¿Qué hará un SQLiteCursor si una columna es nula?
  • SQLite de Android que elimina una fila específica de la base de datos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.