Fehler beim Einfügen mehrerer Zeilen in SQLite
Mir gefällt dein Ansatz überhaupt nicht. Es ist so hardcored und es sieht aus wie Spaghetti-Code. Und Ihr Ansatz wird niemals funktionieren, weil eine Einfügung nur einen Wert haben kann . Sie machen es also falsch. Was ist mit der Verwendung von API insert()
Methode, die es direkt zum Einfügen entworfen hat?
Auch aus Sicht der Geschwindigkeitsleistung und Sicherheit empfehle ich Ihnen, TRANSACTION
zu verwenden auch. Aber lassen Sie uns etwas Code speziell für Sie schreiben.
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();
}
}
}
Anmerkungen:
Wie ich bemerkt habe, haben Sie eine Tabelle namens Constacts Daher empfehle ich Ihnen, einen eigenen Objektkontakt zu erstellen das wird Ihre Tabelle auf der Anwendungsebene darstellen, wo die Eigenschaften des Objekts gleich den Spalten in der Tabelle sind. Ich empfehle Ihnen, diesen Ansatz zu verwenden, weil:
- Es ist kein Spagetthi-Code
- Es ist ziemlich schneller
- Es ist viel sicherer
Ein paar Vorschläge zum Schluss:
execSQL()
ist nicht schlecht, aber ich benutze es im Allgemeinen nur, wenn ich SQLiteOpenHelper
erstelle Unterklasse zum Erstellen und Löschen und Ändern von Tabellen. Da ist eine Verwendung ziemlich passend. Aber als Hauptempfehlungen an Sie sind:
- Jedes Mal, wenn Sie eine Transaktion einfügen, aktualisieren oder löschen, ist dies immer eine sehr gute Praxis, denn abgesehen von der Erhöhung der Geschwindigkeitsleistung (insbesondere wenn Sie eine große Anzahl von Zeilen einfügen) ist Ihre Arbeit mit der Datenbank viel sicherer.
Nur zur Info: Ich habe einige Tests durchgeführt, als ich 1000, 10.000, 100.000 Zeilen in SQLite eingefügt habe, und ich kann Ihnen sagen, dass das Einfügen von 100.000 Zeilen nur 55.346 gedauert hat Sekunden. Das Einfügen von 1.000 Zeilen ohne Transaktion dauerte sogar 73.398 Sekunden.
- Verwenden Sie jedes Mal, wenn Sie eine oder mehrere Tabellen auswählen, einfügen oder aktualisieren, Platzhalter dh parametrisierte Anweisungen und nicht fest codiert. Damit werden Ihre Abfragen sicherer, schneller und besser lesbar. Verwenden Sie im Falle einer Verknüpfung immer die Verknüpfungsklausel. Es ist am besten, Sie können wählen.
Aktualisierung:
Hier funktioniert Ihr Code:
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'
Aktualisierung 2:
Wie @Korniltsev Anatoly in SQLite betonte, gibt es eine Einschränkung SQLITE_MAX_COMPOUND_SELECT
das bedeutet, dass Sie nicht mehr als 500 Gewerkschaften gleichzeitig verwenden können.