SQLite
 sql >> Base de données >  >> RDS >> SQLite

Insérer plusieurs lignes dans SQLite Erreur (code d'erreur =1)

Insérer plusieurs lignes dans l'erreur SQLite

Je n'aime vraiment pas votre approche. C'est tellement dur et ça ressemble à du code spaghetti. Et votre approche ne fonctionnera jamais car un insert ne peut avoir qu'une seule valeur . Donc, vous le faites mal.Qu'en est-il de l'utilisation de API insert() méthode qu'il a directement conçue pour l'insertion ?

Aussi du point de vue des performances de vitesse et de la sécurité, je vous recommande d'utiliser TRANSACTION aussi bien. Mais allons écrire du code spécialement pour vous.

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

Remarques :

Comme j'ai remarqué que vous avez une table appelée Constacts donc je vous suggère de créer propre Object Contact qui représentera votre table sur la couche d'application où les propriétés de l'objet sont égales aux colonnes de la table. Je vous recommande d'utiliser cette approche car :

  • Ce n'est pas du code spagetthi
  • C'est assez rapide
  • C'est beaucoup plus sûr

Quelques suggestions à la fin :

execSQL() n'est pas mauvais mais je ne l'utilise généralement que lorsque je crée SQLiteOpenHelper sous-classe pour créer, supprimer et modifier des tables. Là, une utilisation est assez appropriée. Mais voici les principales recommandations :

  • Chaque fois que vous insérez, mettez à jour, supprimez une utilisation de transaction, c'est toujours une très bonne pratique, car à l'exception de l'augmentation des performances de vitesse (surtout si vous insérez un grand nombre de lignes), votre travail avec la base de données est beaucoup plus sûr.

Uniquement pour info : J'ai fait quelques tests lorsque j'ai inséré 1000, 10 000, 100 000 lignes dans SQLite et je peux vous dire que l'insertion de 100 000 lignes n'a pris que 55 346 secondes. L'insertion de 1 000 lignes sans transaction a même pris 73 398 secondes.

  • Chaque fois que vous sélectionnez, insérez, mettez à jour un ou plusieurs tableaux, utilisez des espaces réservés c'est-à-dire des instructions paramétrées et non codées en dur. Avec lui, vos requêtes deviendront plus sûres, plus rapides et mieux lisibles par l'homme. Dans le cas d'une jointure, utilisez toujours la clause join. Il vaut mieux que vous puissiez choisir.

Mise à jour :

Voici le fonctionnement de votre code :

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'

Mise à jour 2 :

Comme @Korniltsev Anatoly l'a souligné dans SQLite, il existe une contrainte SQLITE_MAX_COMPOUND_SELECT cela signifie que vous ne pouvez pas utiliser plus de 500 unions à la fois.