sql >> Databáze >  >> RDS >> SQLite

Vložit více řádků do chyby SQLite (kód chyby =1)

Vložit více řádků do SQLite Error

Váš přístup se mi opravdu nelíbí. Je to tak tvrdé a vypadá to jako kód na špagety. A váš přístup nikdy nebude fungovat, protože jedna vložka může mít pouze jednu hodnotu . Takže to děláte špatně. Co takhle použít API insert() metodu, kterou přímo navrhl pro vkládání?

Také z hlediska rychlosti, výkonu a bezpečnosti doporučuji použít TRANSACTION také. Ale pojďme napsat nějaký kód speciálně pro vás.

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

Poznámky:

Jak jsem si všiml, máte tabulku s názvem Kontakty proto vám doporučuji vytvořit vlastní kontakt objektu který bude reprezentovat vaši tabulku na aplikační vrstvě, kde vlastnosti objektu jsou stejné jako sloupce v tabulce. Doporučuji vám použít tento přístup, protože:

  • Není to kód spagetthi
  • Je to mnohem rychlejší
  • Je to mnohem bezpečnější

Několik návrhů na závěr:

execSQL() není špatný, ale používám ho obecně, pouze když vytvářím SQLiteOpenHelper podtřída pro vytváření a mazání a úpravy tabulek. Tam je použití docela vhodné. Ale jako hlavní doporučení pro vás jsou:

  • Pokaždé, když vkládáte, aktualizujete, mažete použití transakce, je vždy velmi dobrou praxí, protože kromě zvýšení rychlosti výkonu (zejména pokud vkládáte velké množství řádků) je vaše práce s databází mnohem bezpečnější.

Pouze pro informaci: Udělal jsem několik testů, když jsem do SQLite vložil 1000, 10 000, 100 000 řádků a mohu vám říci, že vložení 100 000 řádků trvalo pouze 55 346 sekundy. Vložení 1 000 řádků bez transakce trvalo dokonce 73 398 sekund.

  • Při každém výběru, vkládání nebo aktualizaci z jedné nebo více tabulek použijte zástupné symboly tj. parametrizované příkazy a ne pevně zakódované. Díky tomu budou vaše dotazy bezpečnější, rychlejší a lépe čitelné pro člověka. V případě spojení vždy použijte spojovací klauzuli. Nejlepší je si vybrat.

Aktualizace:

Zde pracuje váš kód:

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'

Aktualizace 2:

Jak @Korniltsev Anatoly poukázal v SQLite, existuje omezení SQLITE_MAX_COMPOUND_SELECT to znamená, že nemůžete použít více než 500 spojení najednou.



  1. Šifrování zálohování databáze – doporučené postupy

  2. Jak funguje WEIGHT_STRING() v MariaDB

  3. ORA-01460:požadována neimplementovaná nebo nepřiměřená konverze

  4. NOW() Příklady – MySQL