![]() |
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:
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):
SELECT COUNT(ID) FROM Tabelle
Delphi-Quellcode:
Query.First;
for i := 1 to Random(Anzahl_DS) do Query.Next; |
Re: Speichern eines großen Arrays
Zitat:
|
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. |
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; |
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:
Allerdings kenne ich mich mit der Syntax von SQLite nicht aus, evtl. muss das dort anders formuliert werden.
SELECT * FROM VokabelListe
WHERE ID NOT IN (3,7) Achja, und zu Deinem Problemchen: enweder einen Alias verwenden
Delphi-Quellcode:
oder über den Index auf das Feld zugreifen
DeineQuery.SQL.Text := 'SELECT COUNT(ID) AS Anzahl FROM Tabelle';
DeineQuery.Open; x := DeineQuery.FieldByName('Anzahl').Value;
Delphi-Quellcode:
Ich persönlich würde den Alias verwenden, das ist auch später noch nachzuvollziehen.
DeineQuery.SQL.Text := 'SELECT COUNT(ID) FROM Tabelle';
DeineQuery.Open; x := DeineQuery.Fields[0].Value; |
Re: Speichern eines großen Arrays
Eigentlich wollt ich nur vermeiden dass er die gerade gefragt Vokabel gleich wieder fragt, aber ansonsten gute Idee ;)
|
Re: Speichern eines großen Arrays
Was muss ich jetzt alles machen wenn ich die Tabelle in einem Grid darstellen will?
|
Re: Speichern eines großen Arrays
In einem DBGrid? Eine Datasource dazupacken, diese dem DBGrid und als Dataset die Query zuweisen.
|
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
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 19:30 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