sql >> Databasteknik >  >> RDS >> SQLite

Infoga flera rader i SQLite Error (felkod =1)

Infoga flera rader i SQLite Error

Jag gillar verkligen inte ditt tillvägagångssätt. Det är så hårt och det ser ut som spagettikod. Och ditt tillvägagångssätt kommer aldrig att fungera eftersom ett inlägg bara kan ha ett värde . Så du gör det felaktigt. Vad sägs om att använda API insert() metod som den är direkt designad för att infoga?

Även ur synvinkel om hastighetsprestanda och säkerhet rekommenderar jag att du använder TRANSACTION också. Men låt oss gå och skriva lite kod speciellt för dig.

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

Anmärkningar:

Som jag märkte har du en tabell som heter Kontakter så jag föreslår att du skapar egen objektkontakt som kommer att representera din tabell på applikationslagret där egenskaperna för objektet är lika med kolumner i tabellen. Jag rekommenderar dig att använda detta tillvägagångssätt eftersom:

  • Det är inte spagetthikod
  • Det är ganska snabbare
  • Det är mycket säkrare

Några förslag i slutet:

execSQL() är inte dåligt men jag använder det i allmänhet bara när jag skapar SQLiteOpenHelper underklass för att skapa och ta bort och ändra tabeller. Där är en användning ganska lämplig. Men som huvudrekommendationer till dig är:

  • Varje gång du infogar, uppdaterar, tar bort en användning av transaktionen är alltid mycket bra praxis, för förutom att öka hastigheten (speciellt om du infogar ett stort antal rader) är ditt arbete med databasen mycket säkrare.

Endast för information: Jag gjorde några tester när jag infogade 1000, 10 000, 100 000 rader i SQLite och jag kan berätta att infogning av 100 000 rader bara tog 55 346 sekunder. Att infoga 1 000 rader utan transaktion tog till och med 73 398 sekunder.

  • Varje gång du väljer, infogar, uppdaterar från en eller flera tabeller använder du platshållare dvs parametriserade uttalanden och inte hårdkodade. Med den kommer dina frågor att bli säkrare, snabbare och bättre läsbara för människor. Använd alltid join-klausulen vid anslutning. Det är bäst du kan välja.

Uppdatering:

Här fungerar din kod:

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'

Uppdatering 2:

Som @Korniltsev Anatoly påpekade i SQLite finns det en begränsning SQLITE_MAX_COMPOUND_SELECT det betyder att du inte kan använda fler än 500 fackförbund samtidigt.



  1. Valfria argument i WHERE-klausulen

  2. Virtuella kolumner och funktionella index

  3. Oracle radantal av tabell efter antal(*) mot NUM_ROWS från DBA_TABLES

  4. VBA-kod för att lägga till länkad tabell med primärnyckel