Hey,
immer, wenn ich bisher in Programmen Werte speichern wollte, habe ich das via INI gemacht oder auch via Registry. Jetzt habe ich den Fall, dass ich auch ganz lange Strings abspeichern will und da kommen mir beide Lösungen nicht so gut vor?! Im Prinzip lese ich meine Mails aus und will den Inhalt auswerten (nach Absender, Datum, Titel, Inhalt, etc.) und die Ergebnisse speichern, plus den HTML-Code (ca. 20k Zeichen, sofern ich nicht noch zusätzlich cutte), um später ggf. noch andere Dinge auswerten zu können.
Ich habe ein Array für die ganze Mailbox und jede Mail ist eine Map mit ein paar der genannten Eigenschaften.
Auf die Daten muss ich nicht viel zugreifen, es kommt halt immer mal wieder eine Mail rein oder ich werte auch nochmal nachträglich eine Message aus und fülle eine weitere Eigenschaft, aber im Prinzip arbeite ich nur mit dem Array. Falls das Script abstürzt oder der PC mal neustartet, wollte ich die Speicherung parallel zur Veränderung des Arrays halten. An sich könnte ich neue Mails ja auch nachträglich, wenn das Programm wieder läuft, aus dem Postfach laden und ich "verliere" die Daten ja nicht wirklich. Aber es "fühlt" sich irgendwie falsch an, Daten, die ich schon geholt / ausgewertet habe, dann nicht zu behalten.
Da prüfen, ob ein Eintrag existiert oder existiert, aber noch weniger Informationen hat und entsprechend dann den Eintrag erstellen oder ergänzen mir in SQLite schwierig vorkommt (und ich mit AutoIt echt wenig an Beispielen / Tutorials finde), wollte ich dann die Datenbank bei jeder Anpassung des Arrays einfach löschen und neu erstellen, weil ich im Prinzip ja nur das Array sichern will (auch, wenn das irgendwann natürlich schon sehr groß wird).
Hatte auch etwas Code, um das grundsätzlich auszuprobieren und mit SQLite "warm zu werden" (also kein schöner Code, ist zum Testen, bevor ich es verwende^^):
Spoiler anzeigen
#include <MsgBoxConstants.au3>
#include <SQLite.au3>
#include <Array.au3>
Global $mMessage[]
$mMessage.status = "unread"
$mMessage.title = "Newsletter XY"
$mMessage.date = "21.03. 15:15"
$mMessage.id = "g4g43g4g54"
$mMessage.sender = "Seller"
$mMessage.analyzed = False
$mMessage.html = "<HTML>...</HTML>"
Local $sSQliteDll = _SQLite_Startup("Data\sqlite3.dll", False, 1)
If @error Then
MsgBox($MB_SYSTEMMODAL, "SQLite Fehler", "SQLite3.dll konnte nicht geladen werden!")
Exit -1
EndIf
Global $hMessagesDb = _SQLite_Open(@ScriptDir & "\Data\messages.db")
_SQLite_Exec($hMessagesDb, 'CREATE TABLE Messages (status, title, date, id, sender, analyzed, html);')
_SQLite_Exec($hMessagesDb, 'INSERT INTO Messages VALUES ("' & $mMessage.status & '", "' & $mMessage.title & '", "' & $mMessage.date & '", "' & $mMessage.id & '", "' & $mMessage.sender & '", "' & $mMessage.analyzed & '", "' & $mMessage.html & '");')
Local $aResult, $iRows, $iColumns
_SQLite_GetTable2d($hMessagesDb, 'SELECT * FROM Messages;', $aResult, $iRows, $iColumns)
_ArrayDelete($aResult, 0)
Dim $aMailbox[UBound($aResult)]
For $i = 0 To UBound($aResult) - 1
Dim $mMessage[]
$mMessage.status = $aResult[$i][0]
$mMessage.title = $aResult[$i][1]
$mMessage.date = $aResult[$i][2]
$mMessage.id = $aResult[$i][3]
$mMessage.sender = $aResult[$i][4]
$mMessage.analyzed = $aResult[$i][5] == "True" ? True : False
$mMessage.html = $aResult[$i][6]
$aMailbox[$i] = $mMessage
Next
_ArrayDisplay($aMailbox, "Results from the query")
ConsoleWrite($aMailbox[0].title & @CRLF)
_SQLite_Close($hMessagesDb)
_SQLite_Shutdown()
FileDelete(@ScriptDir & "\Data\messages.db")
Alles anzeigen
Jetzt stehe ich vor ein paar Fragen:
- Ist es für den Use Case überhaupt notwendig / sinnvoll, SQLite zu verwenden (v. a. nur wegen der Stringlänge vom HTML-Code)? Oder geht das doch "smarter"?
- Oder sollte ich sogar grundsätzlich, wenn davon auszugehen ist, dass es irgendwann 1000+ Mails sind, weg von einem Array und direkt auf der Datenbank arbeiten? (ich stelle den Inhalt des Arrays auch in einem Listview dar, wobei ich das vllt. aber später noch auf die 100 letzten oder so begrenze)
- Kennt ihr Beispiele, mit denen ich mir für SQLite aneigenen kann? Vor allem halt das Thema => Ist ein Eintrag mit einer bestimmten ID da? Wenn ja, hat er auch z. B. schon "analyzed = True"? Und je nachdem, was im Array steht, wird er hinzugefügt, es passiert nichts oder es werden nur die Ergebnisse der Auswertung hinzugefügt (im ersten Zuge hole ich immer nur Status, Title, Datum und ID aus der Mailbox-Übersicht)
Danke für euren Input!
*edit*
Ein Gedanke kam mir noch: Vielleicht auch wie gewohnt die ganzen Informationen einfach in die Registry und dann nur für das HTML eine eigene Datenbank... Dann wäre das Handling weiter einfach und die großen Strings liegen woanders. Es braucht dann ja auch keine Anpassungen in der Datenbank, es kommen nur neue Einträge dazu und den einfachen Check, ob schon da oder nicht, das sollte mit WHERE und der ID dann ja klappen... Dann könnte ich auch den ganzen HTML-Kram aus meinem Speicher / dem Array rauslassen und nur bei Bedarf holen *hmmm* ...