Qual è il limite delle variabili SQL che è ansible specificare in una singola query execSQL

Sto cercando di migliorare la velocità dei miei inserimenti di database Android. Quello che sto facendo attualmente è generare una stringa come:

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

E poi eseguirlo 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); 

Ricevo il seguente errore quando provo ad inserire circa 2000 righe:

 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 ?, ?, ?, ? 

Quando provo a inserire circa 200 righe, tutto funziona correttamente.

Suppongo sia ovvio: sto cercando di execSQL troppe variabili in un singolo execSQL . Qualcuno sa qual è il limite in modo da poter dividere le righe che inserisco nei lotti appropriati?

Il limite è hardcoded in sqlite3.c ed è impostato su 999. Sfortunatamente può essere modificato, ma solo al momento della compilazione. Ecco i frammenti pertinenti:

 /* ** 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 

Sto cercando di migliorare la velocità dei miei inserimenti di database Android . Quello che sto facendo attualmente è generare una stringa come:

Hai pensato di utilizzare TRANSACTION ? Ti suggerisco di usarlo al posto del tuo approccio. Penso che usare la clausola UNION non sia affatto una “vittoria” e che ci sia un modo migliore e soprattutto più sicuro per raggiungerlo.

 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(); }