Ich muss eine ziemlich große XML-Datei analysieren (die zwischen ungefähr hundert Kilobyte und mehreren hundert Kilobyte variiert), die ich verwende Xml#parse(String, ContentHandler)
. Ich teste dies derzeit mit einer 152-KB-Datei.
Während des Parsens füge ich die Daten auch in eine SQLite-Datenbank ein, indem ich Aufrufe ähnlich den folgenden verwende : getWritableDatabase().insert(TABLE_NAME, "_id", values)
. All dies zusammen dauert ungefähr 80 Sekunden für die 152-KB-Testdatei (was das Einfügen von ungefähr 200 Zeilen bedeutet).
Wenn ich alle Einfügeanweisungen auskommentiere (aber alles andere belasse, wie z. B. das Erstellen ContentValues
usw.), dauert dieselbe Datei nur 23 Sekunden.
Ist es normal, dass die Datenbankoperationen einen so großen Overhead haben? Kann ich etwas dagegen tun?
Da der von Yuku und Brett erwähnte InsertHelper jetzt veraltet ist (API-Stufe 17), scheint die von Google empfohlene richtige Alternative die Verwendung von SQLiteStatement zu sein .
Ich habe die Datenbank-Einfügemethode wie folgt verwendet:
Nachdem ich auch einige schwerwiegende Leistungsprobleme hatte, beschleunigte der folgende Code meine 500 Einfügungen von 14,5 Sekunden auf nur 270 ms , erstaunlich!
So habe ich SQLiteStatement verwendet:
quelle
Das Kompilieren der SQL-Insert-Anweisung beschleunigt die Arbeit. Es kann auch mehr Aufwand erfordern, um alles zu stützen und eine mögliche Injektion zu verhindern, da jetzt alles auf Ihren Schultern liegt.
Ein weiterer Ansatz, der ebenfalls die Arbeit beschleunigen kann, ist die unterdokumentierte Klasse android.database.DatabaseUtils.InsertHelper. Mein Verständnis ist, dass es tatsächlich kompilierte Einfügeanweisungen umschließt. Der Wechsel von nicht kompilierten Transaktions-Inserts zu kompilierten Transaktions-Inserts war für meine großen (200K + Einträge), aber einfachen SQLite-Inserts etwa dreimal schneller (2 ms pro Insert bis 0,6 ms pro Insert).
Beispielcode:
quelle
Wenn die Tabelle einen Index enthält, sollten Sie ihn vor dem Einfügen der Datensätze löschen und nach dem Festschreiben Ihrer Datensätze wieder hinzufügen.
quelle
Bei Verwendung eines ContentProviders:
Dann die private Funktion zum Ausführen der Einfügung (noch in Ihrem Inhaltsanbieter):
quelle