![]() |
Datenbank: SQLITE • Version: - • Zugriff über: -
Alternative für SQLite auf Android Gerät (fmx)
Ich habe bisher meine Android Apps mit einer lokalen SQLite DB laufen lassen.
Das ging ganz gut, da die Daten welche ich gespeichert habe sehr klein waren. Nun muss ich ca 10.000 Datensätze speichern ( imo immer noch klein ) und das dauert ca 2 min. Das SQLite nun nicht das schnellste ist, ist mir bewusst. Das es so extrem langsam ist dachte ich nicht. Was ist mit IBLite/ToGo? Ich habe die InterBase XE7 ToGo Edition. Ist das IBLite/ToGo? Kann ich damit lokale Datenbanken auf dem Pad anlegen? |
AW: Alternative für SQLite auf Android Gerät (fmx)
Mal eine Frage, wo holst Du die Daten her und wie kommen diese auf Dein Gerät ? Ich habe schon Experimente mit 100.000 Datensätzen in einer SQLite Datenbank gemacht. Da gingen die Abfragen alle sehr performant. Vielleicht liegt es ja nicht an der SQLite Datenbank sondern, wie Du die Daten in die Datenbank bringst.
|
AW: Alternative für SQLite auf Android Gerät (fmx)
Zitat:
Auch relevant für die Geschwindigkeit ist, woher die Daten geladen/erstellt werden. Wenn es sich hier um kleine Datenmengen und ein performantes laden/erstellen der Daten handelt, sind eventuell unglückliche Indizes in der Tabelle definiert, die das ganze ausbremsen? |
AW: Alternative für SQLite auf Android Gerät (fmx)
Zumal SQLite nicht zum Speichern von größeren Daten in der Datenbank geeignet ist. Ich spreche hier nicht von der Anzahl, sondern der Größe des einzelnen Eintrags. Also Dateien in die SQLite-Datenbank speichern ist sehr langsam.
|
AW: Alternative für SQLite auf Android Gerät (fmx)
es liegt definitiv an sqlite.
Ich lade die Daten per JSON herunter. Aber wenn ich in der Schleife um den JSONArray das ExecSQL von meinem TDataset auskommentiere, dann rast er durch den Array. Ich lasse das aktuell noch unter Windows laufen. Bisher auf einem UNC Pfade und nun habe ich es lokal auf meine Platte geschrieben. Programm 0% Auslast und die Platte rattert sich nen Ast. Und selbst auf meiner SSD ist es nicht schneller ( nur leiser :-) ) evtl habe ich auch meine Tabelle falsch definiert.
Code:
const createflgpl_1 = 'CREATE TABLE IF NOT EXISTS FLGPL_1 ('+
' LG_NR TEXT NOT NULL PRIMARY KEY,'+ ' LG_FIL TEXT,'+ ' LG_PLATZ TEXT,'+ ' LG_ARTIKEL TEXT,'+ ' LG_TEIL TEXT,'+ ' LG_BMGB REAL,'+ ' LG_BMGV REAL,'+ ' LG_EKPR REAL,'+ ' LG_BMGB_ORG REAL,'+ ' LG_BMGV_ORG REAL,'+ ' LG_EKPR_ORG REAL,'+ ' LG_WEDATUM TEXT,'+ ' LG_ERSTWE TEXT,'+ ' LG_LETZTERWE TEXT,'+ ' LG_AEDT REAL)'; . . . if feld = 'LG_NR' then flgpl_1_insert.parambyname('LG_NR').asstring := myvalue; if feld = 'LG_FIL' then flgpl_1_insert.parambyname('LG_FIL').asstring := myvalue; if feld = 'LG_PLATZ' then flgpl_1_insert.parambyname('LG_PLATZ').asstring := myvalue; if feld = 'LG_ARTIKEL' then flgpl_1_insert.parambyname('LG_ARTIKEL').asstring := myvalue; if feld = 'LG_TEIL' then flgpl_1_insert.parambyname('LG_TEIL').asstring := myvalue; if feld = 'LG_BMGB' then begin flgpl_1_insert.parambyname('LG_BMGB').asstring := myvalue; flgpl_1_insert.parambyname('LG_BMGB_ORG').asstring := myvalue; end; if feld = 'LG_BMGV' then begin flgpl_1_insert.parambyname('LG_BMGV').asstring := myvalue; flgpl_1_insert.parambyname('LG_BMGV_ORG').asstring := myvalue; end; if feld = 'LG_EKPR' then begin flgpl_1_insert.parambyname('LG_EKPR').asstring := myvalue; flgpl_1_insert.parambyname('LG_EKPR_ORG').asstring := myvalue; end; if feld = 'LG_WEDATUM' then flgpl_1_insert.parambyname('LG_WEDATUM').asstring := myvalue; if feld = 'LG_ERSTWE' then flgpl_1_insert.parambyname('LG_ERSTWE').asstring := myvalue; if feld = 'LG_LETZTERWE' then flgpl_1_insert.parambyname('LG_LETZTERWE').asstring := myvalue; end; flgpl_1_insert.ExecSQL; // <- Kommentiere ich das aus, rennt er durch den Array Edit : Die DB hat mit den 10.000 Datensätze dann eine Größe von 2.320kb. Also nichts. |
AW: Alternative für SQLite auf Android Gerät (fmx)
Da fehlt irgendwie der entscheidende Teil der Schleife in deinem Beispiel oben. Das "Create Table" wird aber nur einmal ausgeführt und nicht bei jedem der 10.000 Schritte, oder?
Mache mal vor (außerhalb) der Schleife ein StartTransaction und danach ein Commit. Wenn der jede Abfrage einzeln Commited wird das sicher auch langsam. Das dürfte bei anderen Datenbanken aber nicht besser sein. |
AW: Alternative für SQLite auf Android Gerät (fmx)
Interessant wäre es zu sehen, wie das Insert-Statement aussieht, im obigen Beispiel sieht man ja nur die Parameterbefüllung.
Ließe die sich eventuell etwas vereinfachen?
Delphi-Quellcode:
if feld = 'LG_BMGB' then begin
flgpl_1_insert.parambyname('LG_BMGB').asstring := myvalue; flgpl_1_insert.parambyname('LG_BMGB_ORG').asstring := myvalue; end else if feld = 'LG_BMGV' then begin flgpl_1_insert.parambyname('LG_BMGV').asstring := myvalue; flgpl_1_insert.parambyname('LG_BMGV_ORG').asstring := myvalue; end else if feld = 'LG_EKPR' then begin flgpl_1_insert.parambyname('LG_EKPR').asstring := myvalue; flgpl_1_insert.parambyname('LG_EKPR_ORG').asstring := myvalue; end else begin flgpl_1_insert.parambyname(feld).asstring := myvalue; end; |
AW: Alternative für SQLite auf Android Gerät (fmx)
Vielleicht sollte man sich
![]() |
AW: Alternative für SQLite auf Android Gerät (fmx)
Die fehlende Transaktion war es. Dachte ich könnte mir diese sparen, da wenn das Ding auf dem Pad läuft eh nu einer zugreift.
Danke für den Tipp. |
AW: Alternative für SQLite auf Android Gerät (fmx)
Was hast du in eine Transaktion geklammert - nur das Statement oder alles?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:39 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 by Thomas Breitkreuz