Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Speichern eines großen Arrays (https://www.delphipraxis.net/149837-speichern-eines-grossen-arrays.html)

DeddyH 1. Apr 2010 11:13

Re: Speichern eines großen Arrays
 
Es gibt die Property RecordCount, die soll aber nicht immer zuverlässig sein (hab ich zumindest gelesen, ich nutze die eigentlich nie). Was auf jeden Fall zuverlässige Werte liefern sollte, ist ein
SQL-Code:
SELECT COUNT(ID) FROM Tabelle
Damit bekommst Du aber lediglich die Anzahl der Datensätze der Tabelle, nicht hingegen deren ID an sich. Also würde ich die Anzahl einmalig ermitteln und mir in einer Variablen merken (zumindest solange ausgeschlossen ist, dass während des Programmablaufs Datensätze eingefügt oder gelöscht werden können). Einen zufälligen DS müsste man dann so bekommen können (ungetestet):
Delphi-Quellcode:
Query.First;
for i := 1 to Random(Anzahl_DS) do
  Query.Next;

s.h.a.r.k 1. Apr 2010 12:19

Re: Speichern eines großen Arrays
 
Zitat:

Zitat von DeddyH
Es gibt die Property RecordCount, die soll aber nicht immer zuverlässig sein (hab ich zumindest gelesen, ich nutze die eigentlich nie).

:shock: uiuiui... sicher?

Blup 1. Apr 2010 12:34

Re: Speichern eines großen Arrays
 
Ich vermute das mit einer Datenbank die genannten Probleme eher noch wachsen und neue hinzukommen werden, insbesondere wenn man sich noch nie mit Datenbanken beschäftigt hat.

Wenn man Strings variabler Größe verwendet, muss man zwar auf "File of" verzichten und die Daten z.B. Binär speichern, aber da die meisten Begriffe kürzer sind, wird die Datei auch kleiner. Das Problem mit der Ladezeit lässt sich dann vermutlich einfach dadurch lösen, daß man die Daten komprimiert speichert/liest und nur im Speicher packt/entpackt. Das lässt sich nach meiner Meinung relativ simpel und schnell realisieren.

Shubit 1. Apr 2010 13:38

Re: Speichern eines großen Arrays
 
Nun ich bin für alle Lösungen offen, aber da Datenbanken extra für großen Mengen an Daten ausgelegt sind, sollten sie gerade für längere Vokabellisten sehr gut geeignet sein und wenn sie die restlichen Anforderungen erfüllen, lohnt es sich sicher sich mal damit zu beschäftigen.

Mir ist gerade noch eine Methode zur Ermittlung eines eines zufälligen Datensatzes eingefallen:
Delphi-Quellcode:
DeineQuery.SQL.Text := 'SELECT COUNT(ID) FROM Tabelle';
DeineQuery.Open;
x := DeineQuery //ja hier müsste irgendwie die Antwort der SQL hin
x := x-2;
repeat
DeineQuery.SQL.Text := 'SELECT * FROM VokabelListe WHERE id != LetzteID LIMIT :x, 1 ';
DeineQuery.ParamByName('x').Value := random(x);
DeineQuery.Open;
until DeineQuery.FieldByName('Feld1').AsFloat > Random;

DeddyH 1. Apr 2010 14:03

Re: Speichern eines großen Arrays
 
Moment, Du möchtest also auf jeden Fall vermeiden, dass einzelne Vokabeln doppelt abgefragt werden? Dann könntest Du Dir die bereits abgefragten DS (besser gesagt: deren IDs) in einer Liste merken und das SQL entsprechend dynamisch zusammenbauen. Angenommen, die IDs 3 und 7 wurden bereits abgefragt, dann könnte das nächste Statement dann so aussehen:
SQL-Code:
SELECT * FROM VokabelListe
WHERE ID NOT IN (3,7)
Allerdings kenne ich mich mit der Syntax von SQLite nicht aus, evtl. muss das dort anders formuliert werden.

Achja, und zu Deinem Problemchen: enweder einen Alias verwenden
Delphi-Quellcode:
DeineQuery.SQL.Text := 'SELECT COUNT(ID) AS Anzahl FROM Tabelle';
DeineQuery.Open;
x := DeineQuery.FieldByName('Anzahl').Value;
oder über den Index auf das Feld zugreifen
Delphi-Quellcode:
DeineQuery.SQL.Text := 'SELECT COUNT(ID) FROM Tabelle';
DeineQuery.Open;
x := DeineQuery.Fields[0].Value;
Ich persönlich würde den Alias verwenden, das ist auch später noch nachzuvollziehen.

Shubit 1. Apr 2010 17:17

Re: Speichern eines großen Arrays
 
Eigentlich wollt ich nur vermeiden dass er die gerade gefragt Vokabel gleich wieder fragt, aber ansonsten gute Idee ;)

Shubit 1. Apr 2010 19:55

Re: Speichern eines großen Arrays
 
Was muss ich jetzt alles machen wenn ich die Tabelle in einem Grid darstellen will?

DeddyH 1. Apr 2010 20:01

Re: Speichern eines großen Arrays
 
In einem DBGrid? Eine Datasource dazupacken, diese dem DBGrid und als Dataset die Query zuweisen.

xZise 1. Apr 2010 20:03

Re: Speichern eines großen Arrays
 
Moin,
erstmal mach wegen deiner Gridfrage einen neuen Post auf. Und bezüglich SQLite könntest du eventuell das Problem haben, wenn du eineindeutige IDs benutzt. Wenn wir also keine ID jemals zweimal vergeben und zu Anfang mal n Vokabeln haben, dann haben wir 1 bis n IDs (wenn ich mich richtig erinnere beginnen die IDs bei 1). Wenn du jetzt eine ID x zwischen n und 1 löscht und einen Eintrag hinzufügst, dann hat er die ID n + 1 und nicht x.

Ich würde also mir alle IDs holen (SELECT ID FROM Vocs) und dann zufällig eine davon Auswählen.

MfG
Fabian

DP-Maintenance 1. Apr 2010 23:50

DP-Maintenance
 
Dieses Thema wurde von "Luckie" von "Sonstige Fragen zu Delphi" nach "Datenbanken" verschoben.
Mittlerweile sind wir wohl bei Datenbanken angekommen. Für das Internetupdate deines Programms machst du aber bitte einen neuen Thread auf. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr.
Seite 2 von 3     12 3      

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