sql >> Database >  >> RDS >> SQLite

Voeg meerdere rijen in SQLite-fout in (foutcode =1)

Meerdere rijen invoegen in SQLite-fout

Ik hou echt niet van je aanpak. Het is zo hardcore en het lijkt op spaghetticode. En uw aanpak zal nooit werken omdat één invoeging slechts één waarde kan hebben . Je doet het dus niet goed. Hoe zit het met het gebruik van API insert() methode die het direct heeft ontworpen om in te voegen?

Ook vanuit het oogpunt van snelheidsprestaties en beveiliging raad ik u aan om TRANSACTION te gebruiken ook. Maar laten we wat code gaan schrijven speciaal voor jou.

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

Opmerkingen:

Zoals ik heb gemerkt, heb je een tabel met de naam Constacts dus ik raad je aan om eigen Object Contact te maken die uw tabel op de toepassingslaag vertegenwoordigt, waar de eigenschappen van het object gelijk zijn aan de kolommen in de tabel. Ik raad je aan om deze aanpak te gebruiken omdat:

  • Het is geen spagetthi-code
  • Het is behoorlijk sneller
  • Het is veel veiliger

Een paar suggesties aan het einde:

execSQL() is niet slecht, maar ik gebruik het over het algemeen alleen als ik SQLiteOpenHelper aanmaak subklasse voor het maken en verwijderen en wijzigen van tabellen. Daar is een gebruik redelijk geschikt. Maar de belangrijkste aanbevelingen voor u zijn:

  • Iedere keer dat u een transactiegebruik invoegt, bijwerkt of verwijdert, is dit altijd een goede gewoonte, want behalve het verhogen van de snelheidsprestaties (vooral als u een groot aantal rijen invoegt) is uw werken met de database veel veiliger.

Alleen ter info: Ik heb een paar tests gedaan toen ik 1000, 10 000, 100.000 rijen in SQLite invoegde en ik kan je vertellen dat het invoegen van 100.000 rijen slechts 55,346 kostte seconden. Het invoegen van 1000 rijen zonder transactie kostte zelfs 73,398 seconden.

  • Telkens wanneer u een of meer tabellen selecteert, invoegt of bijwerkt, gebruikt u plaatsaanduidingen d.w.z. geparametriseerde verklaringen en niet hardcoded. Hiermee worden uw zoekopdrachten veiliger, sneller en beter leesbaar voor mensen. Gebruik in het geval van joinen altijd de join-clausule. Je kunt het beste kiezen.

Bijwerken:

Hier werkt uw 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'

Update 2:

Zoals @Korniltsev Anatoly opmerkte in SQLite is er een beperking SQLITE_MAX_COMPOUND_SELECT dat betekent dat je niet meer dan 500 vakbonden tegelijk kunt gebruiken.



  1. Een inleiding tot SQL-indexen

  2. Hoe Div() werkt in PostgreSQL

  3. Is het veilig om gebruikersnamen en wachtwoorden in de database op te slaan?

  4. Typen in MySQL:BigInt(20) vs Int(20)