Inserisci più righe nell'errore SQLite
Non mi piace molto il tuo approccio. È così hardcore e sembra un codice spaghetti. E il tuo approccio non funzionerà mai perché un inserto può avere solo un valore . Quindi lo stai facendo in modo errato. Che ne dici di usare API insert()
metodo che ha progettato direttamente per l'inserimento?
Anche dal punto di vista delle prestazioni di velocità e sicurezza ti consiglio di utilizzare TRANSACTION
anche. Ma andiamo a scrivere del codice apposta per te.
public void insertMultiple(List<Contact> contacts) {
Contact c = null;
ContentValues values = new ContentValues();
try {
if (db != null) {
db.beginTransaction();
for (Contact c: contacts) {
values.put(SQLConstants.FIRSTNAME, c.getFirstName());
values.put(SQLConstants.LASTNAME, c.getLastName());
...
db.insertOrThrow("Contacts", SQLConstants.FIRSTNAME, values);
values.clear();
}
db.setTransactionSuccessful();
}
}
finally {
if (db != null && db.inTransaction()) {
db.endTransaction();
}
}
}
Note:
Come ho notato, hai una tabella chiamata Constacts quindi ti suggerisco di creare un proprio contatto oggetto che rappresenterà la tua tabella sul livello dell'applicazione in cui le proprietà dell'oggetto sono uguali alle colonne nella tabella. Ti consiglio di utilizzare questo approccio perché:
- Non è un codice spagetthi
- È piuttosto più veloce
- È molto più sicuro
Alcuni suggerimenti alla fine:
execSQL()
non è male ma lo sto usando generalmente solo quando creo SQLiteOpenHelper
sottoclasse per creare, eliminare e modificare tabelle. C'è un utilizzo è abbastanza adatto. Ma i principali consigli per te sono:
- Ogni volta che inserisci, aggiorni, elimini un utilizzo di una transazione è sempre un'ottima pratica, perché a parte l'aumento delle prestazioni di velocità (soprattutto se stai inserendo un gran numero di righe) il tuo lavoro con il database è molto più sicuro.
Solo per info: Ho fatto alcuni test quando ho inserito 1000, 10 000, 100 000 righe in SQLite e posso dirti che l'inserimento di 100 000 righe ha richiesto solo 55.346 secondi. L'inserimento di 1 000 righe senza transazione ha richiesto anche 73.398 secondi.
- Ogni volta che selezioni, inserisci, aggiorni da una o più tabelle usa segnaposto cioè istruzioni parametrizzate e non codificate. Con esso, le tue query diventeranno più sicure, più veloci e meglio leggibili dall'uomo. In caso di adesione utilizzare sempre la clausola join. È meglio che tu possa scegliere.
Aggiornamento:
Ecco che funziona il tuo codice:
insert into Contacts(ID, FirstName, LastName, PhoneNumber, EmailId, Status)
select 'someId' as ID, 'xxx' as FirstName, 'xxx' as LastName , '9008987887' as PhoneNumber , '[email protected]' as EmaiId, 'Yes' as Status
union all select 'someId', 'xxx', 'xxx', '9008987887', '[email protected]', 'Yes'
union all select 'someId', 'xxx', 'xxx', '9008987887', '[email protected]', 'Yes'
Aggiornamento 2:
Come ha sottolineato @Korniltsev Anatoly in SQLite esiste un vincolo SQLITE_MAX_COMPOUND_SELECT
ciò significa che non puoi utilizzare più di 500 unioni contemporaneamente.