SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Wstaw wiele wierszy w błędzie SQLite (kod błędu =1)

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połączenie wewnętrzne SQLite

  2. Jak działa RandomBlob() w SQLite

  3. Jak zawijać długie wiersze tekstu w wynikach SQLite

  4. Android :Jak dynamicznie ładować obraz z serwera według nazwy z SQlite

  5. Prawidłowe formaty ciągów czasu dla funkcji daty/czasu SQLite