¿Cuál es el límite de variables SQL que se pueden especificar en una sola consulta execSQL

Estoy intentando mejorar la velocidad de mis inserciones de la base de datos del androide. Lo que estoy haciendo actualmente es generar una cadena como:

SELECT ? as title, ? as musician_id, ? as album_id, ? as genre UNION SELECT ?, ?, ?, ? UNION SELECT ?, ?, ?, ? UNION SELECT ?, ?, ?, ? UNION SELECT ?, ?, ?, ? UNION SELECT ?, ?, ?, ? 

Y luego ejecutarlo con

 SQLiteDatabase database = //initialized in some way String insertQuery; // the string of the query above String [] parameters; // the parameters to use in the insertion. database.execSQL(insertQuery.toString(), parameters); 

Estoy consiguiendo el error siguiente cuando intento insertar alrededor de 2000 filas:

 Caused by: android.database.sqlite.SQLiteException: too many SQL variables (code 1): , while compiling: INSERT INTO songs (title, musician_id, album_id, genre) SELECT ? as title, ? as musician_id, ? as album_id, ? as genre UNION SELECT ?, ?, ?, ? UNION SELECT ?, ?, ?, ? 

Cuando intento insertar alrededor de 200 filas todo trabaja muy bien.

Supongo que es obvio – estoy tratando de pasar en demasiadas variables en un único execSQL . ¿Alguien sabe cuál es el límite para que pueda dividir las filas que inserto en lotes adecuados?

2 Solutions collect form web for “¿Cuál es el límite de variables SQL que se pueden especificar en una sola consulta execSQL”

El límite es hardcoded en sqlite3.c y se fija a 999. Desafortunadamente puede ser cambiado pero solamente en tiempo de la compilación. Aquí están los fragmentos relevantes:

 /* ** The maximum value of a ?nnn wildcard that the parser will accept. */ #ifndef SQLITE_MAX_VARIABLE_NUMBER # define SQLITE_MAX_VARIABLE_NUMBER 999 #endif /* ** The datatype ynVar is a signed integer, either 16-bit or 32-bit. ** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater ** than 32767 we have to make it 32-bit. 16-bit is preferred because ** it uses less memory in the Expr object, which is a big memory user ** in systems with lots of prepared statements. And few applications ** need more than about 10 or 20 variables. But some extreme users want ** to have prepared statements with over 32767 variables, and for them ** the option is available (at compile-time). */ #if SQLITE_MAX_VARIABLE_NUMBER<=32767 typedef i16 ynVar; #else typedef int ynVar; #endif 

Estoy intentando mejorar la velocidad de mis inserciones de la base de datos del androide . Lo que estoy haciendo actualmente es generar una cadena como:

¿Pensaste en usar TRANSACTION ? Le sugiero que lo use en lugar de su enfoque. Creo que la cláusula UNION uso no es un "triunfo" en absoluto y no es mejor y sobre todo manera más segura cómo lograrlo.

 db.beginTransaction(); try { for (int i = 0 ; i < length ; i++ ) { // or another kind of loop etc. // make insert actions } db.setTransactionSuccessful(); // now commit changes } finally { db.endTransaction(); } 
  • Crear la función definida por el usuario en sqlite android?
  • No se ha podido abrir la base de datos de georreferencias de vista web de Android
  • Android Store un objeto parcelable en SQLite
  • SQLiteException: cerca de "": error de sintaxis (código 1) al compilar
  • Obtener base de datos SQLite desde la aplicación de Android
  • Android: ORDER BY en la consulta
  • Actividad y acceso al fondo de acceso a la base de datos SQLite
  • La aplicación se bloquea al actualizar la base de datos sqlite por primera vez
  • El error del cursor en Android me dice que la columna no existe
  • GetWritableDatabase () VS getReadableDatabase ()
  • Problemas para obtener Calendar.WEEK_OF_YEAR
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.