![]() |
Datenbank: SQLite • Version: ? • Zugriff über: FMX TFDQuery
Beschleunigungstips für SQLite unter Android erwünscht
Hallo,
ich habe viele Datensätze in eine SQLite-Datenbank zu schreiben, unter Windows dauert das nur ca. 10 Sekunden, unter Android, der eigentlichen Anwendung braucht der Anwender viel Geduld, da gehen schon mal bis 5 Minuten drauf um ca. 10000 Datensätze mit jeweils ca. 15 Feldern zu schreiben! Jetzt suche ich Möglichkeiten das zu beschleunigen: Bisher habe ich sinngemäß folgendes gemacht:
Delphi-Quellcode:
Jetzt habe ich alle INSERTS in einer Stringlist und arbeite diese so ab:
FDQuery.Append;
FDQuery.Edit; FDQuery.fieldByName('xxxx').AsString := 'asdffghg'; FDQuery.post;
Delphi-Quellcode:
Das geht minimal schneller, vielleicht 4 anstelle 5 Minuten :cry:
FDQuery.SQL.Text := 'BEGIN TRANSACTION;';
FDQuery.ExecSQL; for s := 0 to SQLList.Count - 1 do begin FDQuery.SQL.Text := SQLList[s]; FDQuery.ExecSQL; end; // abschicken FDQuery.SQL.Text := 'COMMIT;'; FDQuery.ExecSQL; Was ist bei mir die Bremse oder geht das auf einem Handy wirklich alles so langsam, hat jemand eine Idee wo ich ansetzen könnte? Ciao Stefan |
AW: Beschleunigungstips für SQLite unter Android erwünscht
Testweise einmal ohne Transaktion probiert?
Auch: Kenne mich mit Datenbanken nicht so wirklich aus, aber konnte man Statements nicht irgendwie "preparen" und am Schluss nur für jeden Datensatz die Parameter neu setzen? |
AW: Beschleunigungstips für SQLite unter Android erwünscht
Vor der Schhleife:
- Insert-Statement mit Parametern formulieren und der Query zuweisen - Prepare aufrufen In der Schleife: - Parameter füllen - ExecSQL ausführen Dann muss das SQL nur 1 mal geparsed werden. Dennoch finde ich den Unterschied Windows <-> Android zu hoch. Was hast du denn für ein Android-Gerät? |
AW: Beschleunigungstips für SQLite unter Android erwünscht
SQLite ist eventuell nicht die richtige Datenbank für das Datenvolumen?
Sherlock |
AW: Beschleunigungstips für SQLite unter Android erwünscht
Zitat:
Könntest Du bitte Deinen Tip mal in ein paar Beispielzeilen Code zeigen? Prepare und Parameter sind mir momentan nicht geläufig, Datenbanken sind Neuland für mich. Ciao Stefan |
AW: Beschleunigungstips für SQLite unter Android erwünscht
Hi,
hier ein Beispiel wie ich unter iOS und Android ganz gute Performance erreiche:
Delphi-Quellcode:
mySQLQuery.Sql.Text := 'INSERT INTO jobVollmacht (pid, gesellschaft, art, zeitpunkt) '+ 'VALUES (:pid, :gesellschaft, :art, :zeitpunkt)'; mySQLQuery.ParamByName('pid').AsString := dbModul.aktPid; mySQLQuery.ParamByName('gesellschaft').AsWideString := frmVuAuswahl.lbVuAuswahl.ListItems[i].Text; mySQLQuery.ParamByName('art').AsString := 'Teil'; mySQLQuery.ParamByName('zeitpunkt').AsDateTime := now; mySQLQuery.Prepare; mySQLQuery.ExecSQL; |
AW: Beschleunigungstips für SQLite unter Android erwünscht
Zitat:
Delphi-Quellcode:
FDQuery.SQL.Text := 'insert into TABELLE values (:Feld1, :Feld2, ... :FeldN)';
FDQuery.Prepare; for s := 0 to Anz - 1 do begin FDQuery.ParamByName('Feld1').AsString := 'Wert'; //oder noch schneller: FDQuery.Params[0].AsString := 'Wert'; FDQuery.ParamByName('Feld2').AsInteger := Wert; ... FDQuery.ExecSQL; end; |
AW: Beschleunigungstips für SQLite unter Android erwünscht
Wenn deine Query auch mehrere SQL-Befehle gemeinsam als Skrip absenden kann, könnte das so schneller gehn:
Delphi-Quellcode:
FDQuery.SQL.Text := 'BEGIN TRANSACTION;';
// in "SQLList" müssen die einzelnen Statements bereits mit ';' abgeschlossen ein FDQuery.SQL.Add(SQLList.Text); FDQuery.SQL.Add('COMMIT;'); FDQuery.ExecSQL; ![]() |
AW: Beschleunigungstips für SQLite unter Android erwünscht
Könnte in disem Fall (SQlite) stimmen. Im Allgemeinen dütfte die Variante per Parameter (prepared Statement) aber schneller sein.
|
AW: Beschleunigungstips für SQLite unter Android erwünscht
Danke, danke, danke!
Jetzt habe ich ja erst mal eine Weile zu testen, die Variante mit dem Parameters habe ich glaube ich verstanden, da muss ich jedoch etliches Umbauen. Daher wird der erste Test mal alle Inserts per SQL.Add reinpacken und mit einem ExecSQL abarbeiten sein, mal sehen ob das funktioniert. Danke auch für den Hinweis, das Parameters[index] schneller ist wie ParamByName, ich hätte bestimmt erst letzteres probiert Ciao Stefan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz