¿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(); } 
  • android.database.sqlite.SQLiteException: near "...": error de sintaxis (código 1)
  • ¿Es posible comparar dos cursores?
  • ¿Cómo descargar una base de datos SQLite desde un dispositivo Android?
  • Multi claves primarias en Android SQLite
  • getApplicationContext () devuelve null, pero funciona en otras actividades
  • "Código de error 5: la base de datos está bloqueada" cuando se utiliza un ContentProvider
  • Se ha eliminado una columna no válida al intentar consultar una columna.
  • Android sqlite: cómo recuperar datos específicos de la columna en particular?
  • ¿Existe un caché de memoria para SQLite en Android y cómo liberarlo o borrarlo?
  • Aplicación de Android (Samsung Galaxy Tab, 2.2) no * a veces * escribir en el DB
  • Obtener el resultado del cursor y convertirlo en una cadena para TextView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.