Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Alternative für SQLite auf Android Gerät (fmx) (https://www.delphipraxis.net/193813-alternative-fuer-sqlite-auf-android-geraet-fmx.html)

stalkingwolf 12. Sep 2017 10:43

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?

RWarnecke 12. Sep 2017 10:47

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.

SebastianZ 12. Sep 2017 10:59

AW: Alternative für SQLite auf Android Gerät (fmx)
 
Zitat:

Zitat von stalkingwolf (Beitrag 1380905)
...
Nun muss ich ca 10.000 Datensätze speichern ( imo immer noch klein )
..

Klein ist relativ, es kommt nicht nur auf die Anzahl an, sondern auch wie groß die Daten in den Datensätzen sind. Wenn ich pro Datensatz 10 Bilder mit je 1 MB speichere dauert das deutlich länger, als wenn ein Datensatz nur aus 10 Integer-Werten besteht.
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?

bra 12. Sep 2017 11:05

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.

stalkingwolf 12. Sep 2017 11:13

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.

bra 12. Sep 2017 11:26

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.

nahpets 12. Sep 2017 11:46

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;

DeddyH 12. Sep 2017 11:49

AW: Alternative für SQLite auf Android Gerät (fmx)
 
Vielleicht sollte man sich Array DML einmal anschauen, oder das Ganze zumindest versuchsweise in eine Transaktion packen.

stalkingwolf 12. Sep 2017 11:56

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.

TigerLilly 12. Sep 2017 15:23

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.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz