Inserir várias linhas no erro SQLite
Eu realmente não gosto da sua abordagem. É tão hardcore e parece código de espaguete. E sua abordagem nunca funcionará porque uma inserção pode ter apenas um valor . Então você está fazendo errado. Que tal usar
API insert()
método que ele projetou diretamente para inserir? Também do ponto de vista sobre desempenho de velocidade e segurança, recomendo que você use
TRANSACTION
também. Mas vamos escrever um código especialmente para você. 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();
}
}
}
Observações:
Como notei, você tem uma tabela chamada Contatos então sugiro que você crie um próprio contato de objeto que representará sua tabela na camada de aplicação onde as propriedades do objeto são iguais às colunas da tabela. Eu recomendo que você use essa abordagem porque:
- Não é um código spagetthi
- É bem mais rápido
- É muito mais seguro
Algumas sugestões no final:
execSQL()
não é ruim, mas estou usando geralmente apenas quando crio SQLiteOpenHelper
subclasse para criar e excluir e alterar tabelas. Lá um uso é bastante adequado. Mas como principais recomendações para você são:- Toda vez que você está inserindo, atualizando, deletando uma transação de uso é sempre uma prática muito boa, pois exceto pelo aumento de velocidade de performance (principalmente se você estiver inserindo um grande número de linhas) seus trabalhos com banco de dados são muito mais seguros.
Somente para informações: Fiz alguns testes quando inseri 1.000, 10.000, 100.000 linhas no SQLite e posso dizer que a inserção de 100.000 linhas levou apenas 55.346 segundos. A inserção de 1.000 linhas sem transação levou até 73.398 segundos.
- Sempre que você estiver selecionando, inserindo, atualizando de uma ou mais tabelas, use espaços reservados ou seja, declarações parametrizadas e não codificadas. Com ele, suas consultas se tornarão mais seguras, rápidas e legíveis por humanos. No caso de junção, use sempre a cláusula de junção. É melhor você escolher.
Atualização:
Aqui está trabalhando seu código:
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'
Atualização 2:
Como @Korniltsev Anatoly apontou no SQLite, há uma restrição
SQLITE_MAX_COMPOUND_SELECT
isso significa que você não pode usar mais de 500 sindicatos de uma vez.