Wstaw wiele wierszy w błędzie SQLite
Naprawdę nie podoba mi się twoje podejście. Jest tak hardkorowy i wygląda jak kod spaghetti. Twoje podejście nigdy się nie sprawdzi, ponieważ jedna wstawka może mieć tylko jedną wartość . Więc robisz to niepoprawnie. Po co użyć API insert()
? metoda, która została bezpośrednio zaprojektowana do wstawiania?
Również z punktu widzenia szybkości działania i bezpieczeństwa polecam użyć TRANSACTION
także. Ale chodźmy napisać kod specjalnie dla Ciebie.
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();
}
}
}
Uwagi:
Jak zauważyłem, masz tabelę o nazwie Kontakty więc proponuję utworzyć własny kontakt obiektu które będą reprezentować twoją tabelę na warstwie aplikacji, gdzie właściwości obiektu są równe kolumnom w tabeli. Polecam skorzystać z tego podejścia, ponieważ:
- To nie jest kod spagetthi
- Jest całkiem szybszy
- Jest o wiele bezpieczniejszy
Kilka sugestii na koniec:
execSQL()
nie jest zły, ale używam go generalnie tylko podczas tworzenia SQLiteOpenHelper
podklasa do tworzenia i usuwania oraz modyfikowania tabel. Tam zastosowanie jest całkiem odpowiednie. Ale głównymi zaleceniami dla Ciebie są:
- Za każdym razem, gdy wstawiasz, aktualizujesz, usuwasz użycie transakcji jest zawsze bardzo dobrą praktyką, ponieważ oprócz zwiększenia wydajności (zwłaszcza jeśli wstawiasz dużą liczbę wierszy) Twoja praca z bazą danych jest znacznie bezpieczniejsza.
Tylko informacje: Zrobiłem kilka testów, kiedy wstawiłem 1000, 10 000, 100 000 wierszy do SQLite i mogę powiedzieć, że wstawienie 100 000 wierszy zajęło tylko 55 346 sekundy. Wstawienie 1000 wierszy bez transakcji zajęło nawet 73 398 sekund.
- Za każdym razem, gdy wybierasz, wstawiasz, aktualizujesz z jednej lub kilku tabel, używaj symbolów zastępczych tj. instrukcje sparametryzowane, a nie zakodowane na sztywno. Dzięki niemu Twoje zapytania staną się bezpieczniejsze, szybsze i lepiej czytelne dla człowieka. W przypadku dołączania zawsze używaj klauzuli join. Najlepsze, co możesz wybrać.
Aktualizacja:
Oto działa twój 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'
Aktualizacja 2:
Jak zauważył @Korniltsev Anatoly, w SQLite istnieje ograniczenie SQLITE_MAX_COMPOUND_SELECT
oznacza to, że nie możesz używać więcej niż 500 związków jednocześnie.