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.