German Map.Get macht Parse Fehler bei Boolean

Sinan Tuzcu

Well-Known Member
Licensed User
Longtime User
Hallo,

in einer Datei schreibe ich den Status von einer Checkbox, falls die Datei nicht existiert wie folgt.

B4X:
If File.Exists(File.DirInternal, SettingsFile) Then
        SettingsMap = File.ReadMap(File.DirInternal, SettingsFile)
    Else
        'Create a new map and save
        SettingsMap = CreateMap ("PWask":False)
        File.WriteMap(File.DirInternal, SettingsFile, SettingsMap)
    End If

Beim Lesen des Status
B4X:
chkPWFragen.Checked = SettingsMap.Get("PWask")
bekomme ich Parse Fehler

wie kann ich das verhindern?
 

GMan

Well-Known Member
Licensed User
Longtime User
Hast DU für jeden Eintrag in der Map jeweils ein Keyword und den dazu gehörigen Inhalt definiert / korrekt eingelesen ?
 

Sinan Tuzcu

Well-Known Member
Licensed User
Longtime User
habe gerade mal 3 Einträge Vorname, Nachname und das mit dem Checkbox
B4X:
If File.Exists(File.DirInternal, SettingsFile) Then
        SettingsMap = File.ReadMap(File.DirInternal, SettingsFile)
    Else
        'Create a new map and save
        SettingsMap = CreateMap ("Vorname": "", "Nachname": "","Email": "", "PWask":False)
        File.WriteMap(File.DirInternal, SettingsFile, SettingsMap)
    End If
Lesen:
B4X:
txtVorname.Text = SettingsMap.Get("Vorname")
    txtNachname.Text = SettingsMap.Get("Nachname")
    chkPWFragen.Checked = SettingsMap.Get("PWask")
wenn ich die Zeile chkPWFragen.Checked = SettingsMap.Get("PWask") raus nehme, dann gibt es keinen Fehler
 

OliverA

Expert
Licensed User
Longtime User
WriteMap legt alles ab als "Strings" und ReadMap liest alles zurueck als "Strings"

B4X:
Dim aString as String = SettingsMap.Get("PWask")
chkPWFragen.Checked = aString.EqualsIgnoreCase("True")
 

DonManfred

Expert
Licensed User
Longtime User
Korrect wäre wohl eigentlich eher raf.WriteB4XObject (Randomaccessfile) und raf.ReadB4XObject zu nehmen. Das kommt mit vielen Map-Kombinationen klar.
Oder KVS (ist auf B4XSerializator basierend). Wenngleich @OliverA Antwort auch funktioniert ;-)

Was ist, wenn in der Map ein CustomType gespeichert/ausgelesen werden soll?
 
Last edited:

OliverA

Expert
Licensed User
Longtime User
Komischerweise funktioniert dieses:
B4X:
Dim aBool as Boolean = SettingsMap.Get("PWask")
 

GMan

Well-Known Member
Licensed User
Longtime User
Langsam habe ich das Gefühl, das entweder mein Android Versionen auf dem Smartphones und Tablets oder die Software B4A eine abgespeckte Versionen sind
Kommt drauf an, wo Du das Teil gekauft hast: im Fachgeschäft oder auf dem Flohmarkt :D
Ansonsten haben wir in Sachen B4A nicht nur alle das Gleiche, sondern sogar das Selbe :rolleyes:
 

RWK

Member
Licensed User
Ansonsten haben wir in Sachen B4A nicht nur alle das Gleiche, sondern sogar das Selbe :rolleyes:

Was noch zu beweisen wäre.... im Steuerrecht habe ich extreme Probleme damit der Finanzverwaltung klar zu machen, das die gespeicherte Kopie einer Datei die selbe ist....und nicht nur die gleiche :D:D:D
 

MarkusR

Well-Known Member
Licensed User
Longtime User
Mach doch mal ein Feature Request :D
File.WriteObjectXML
File.ReadObjectXML
 

pucki

Active Member
Licensed User
Ansonsten haben wir in Sachen B4A nicht nur alle das Gleiche, sondern sogar das Selbe :rolleyes:

Schön wäre es. Hab noch b4a 7.3 ;)

Ich persönlich mag diese maps Sachen eh nicht. Ich bevorzuge SQL-Datenbanken. Da kann keiner drin rumpfuschen so schnell. Ich kann alles perfekt abfragen, bzw. zuweisen, und muss mich auch um die Typen (text, Nummerisch) nur bedingt kümmern. 3 Felder reichen um JEDE setup-Einstellung zu speichern. ;)
Beschreibung, typ , Text (alles als Textfeld declariert). Im Typ kommt rein t = text // n = nummerisch // b = boolean (logisch) . Eine Abfrage und schon war es das.

Abfrage über Funktion und das war es.


Gruß

Pucki
 

GMan

Well-Known Member
Licensed User
Longtime User
Jo, wir Alten machen am liebsten mit DBase-Format rum :cool::D
 

pucki

Active Member
Licensed User
Dbase habe ich schon seit einer Ewigkeit nicht mehr programmiert. Ich bräuchte ca. 1 Tag Einarbeitungszeit bis ich mein Clipper (den ich noch habe auf Diskette) wieder beherrsche.

Aber es geht mir einfach um eine relative SICHERE Speicherung von Daten ohne mir um Verschlüsselungstechnik großartig Sorgen zu machen. Auch habe ich mit meine (kostenlosen PC-Software) ein genauen und übersichtlichen Überblick über die Daten. Diese Maps haben kein gescheiten schnellen Zugriff. Einige meiner Datenbanken auf mein Tablett haben ca. 90.000 Datensätze (ist nicht viel ich weiß) und ich merke den Zugriff nicht mal (zeitlich gesehen).

Und wenn man bei Einstellungen einfach eine "schreibe" Funktion aufruft, sobald das Ereignis stattgefunden hat, brauch man nur EIN Befehl ausführen via SQL. Das geht schneller als sich mit Maps rum zu ärgern. Ergo halte ich halt nix davon.

Ich schreibe Software die FÜR MICH pflegeleicht ist. Und das geht nur wenn man so codet, das Änderungen ein nicht in den Wahnsinn treiben.
Beispiel : Der Kunde will noch 5 Einstellungen haben. Naund. 5 Zeilen mehr in der Sql-Datei und das war es. Ich habe sogar schon Software geschrieben wo die SQL-Datei die Texte und die Namen der Buttons kannte und den Visible-Status. Ich steuere halt meine Software lieber über eine Datenbank als das ich mich im Code verzetteln muss.

Das meinte ich mit mein Kommentar oben. Und 99 % meiner Software hat 2 Datenbanken. Eine für die Daten und eine für die Grundparameter der Software. Die eine überlebt immer ein Update. Die andere fast nie. (Beispiel: Preisdatenbanken).

Gruß

Pucki
 

MarkusR

Well-Known Member
Licensed User
Longtime User
Ich bevorzuge SQL-Datenbanken
was mich an diesen Datenbanken stört ist das man die Text länge der Felder definieren muss obwohl in der Programmier Sprache ein String eine flexible länge hat.
Oder Typen der Datenbank nicht mit der Programmiersprache übereinstimmen^^
Und das Objektserialisierte Klassen nicht in das Tabellen Schema passen, das ist alles dann doppelt gemoppelt und im Datenbank Layout schwer darzustellen.
Dieses WriteMap/ReadMap wäre besser wenn es die Typen beibehalten würde.
Bei C# finde ich LINQ (Language Integrated Query) to SQL ganz gut.
 

pucki

Active Member
Licensed User
Du musst die Textlänge nicht wirklich definieren. Es ist nur Empfehlenswert.
Die Sache ist die. Wenn du die Textlänge definiert (ist eh meist bei 255 Zeichen Schluß) ist die Verwaltung der Datenbank durch das Datenbanksystem einfacher. Dies führt zu kleineres Datenbanken und schnelleren Zugriff.

Damals vor anno Tobac gab es 3 Arten von Datenbanken.
Sequenzielle Datenbanken (so was wie das Maps gedöns) = vorne anfangen -hinten aufhören. Die bekanntes Variante sind Datensätze mit Trennzeichen mit TXT-Format.
Relationale Datenbanken = Die sogenannten Karteikarten-Datenbanken (Feste Felder und Struckturen) = sehr beliebt als Adressendatenbanken
Und eine Mischung von beiden.

Die Index Sequenz orientierte Datenbanken. Die legten für jeden Index ein File an. Dieses File enthielt den Indexbegriff und die Sprungadresse. Die wirkliche Datenbank war eine Art Karteikasten mit festen Feldlängen (wie ein Formular). Du konntest den Datensatz auch direkt anspringen wie die die Einsprungadresse berechnet hast nach folgenden Formel (Länge des Datensatz * Nr. des Datensatz). Eine ähnliche Technik benutzte ich heutzutage wenn ich hex-Files lesen tue.

Kommen wie nun zu den Texten die Länge sind als 255 Zeichen. Datenbanken der Generation DBase legten diese Texte in externen Datenfiles ab. Die sogenannten Memo-Dateien. *.dbT . Im der Orginal-Datenbank wird dabei ein Pointer (ähnlich den Indexdateien der ersten Generation) auf diese Text-Datei verlegt. Schreibt nun ein User ein Text in die DB wird dieser in AN die Memo-Datenbank dran gehängt. Nur wirds lustig. Am Ende des Textes schreib die DB ein Pointer (der ist entweder ein EoF (End of Data)) oder eine Sprungadresse wo er Daten weiter lesen kann. Passiert wenn der User ein neuen Text abspeichert der grösser ist als der alte.

Das ganze führte mit der Zeit zu immer langsameren Zugriffen so das man den Befehl "Reorganisieren" ausführen musste. Dabei werden dann gelöschte Datensätze (die nur ein Löschvermerk haben) nicht um kopiert. Weil reorganisieren bedeutet nix anderes als den gesammelten Daten in die richtige Reihenfolge neu zu schreiben. Ein Vorgang den selbst modernste Datenbanken so handhaben. Die neue Datei ist dann je nach Lösch-/Änderungsvorgängen viel kleiner als die alten. Reorg. gibt es auch heute noch. Jedoch ist er kaum noch erforderlich. Grund sind moderne Algorithmen die die Datenbak gut unter Kontrolle haben.

Eine SQL-Datenbank ist ein Zwitter. Sie benutzt beide Techniken gleichzeitig. Man definiert die Länge des Textfeld (und dann ist ein ein Textfeld) oder man lässt es, dann ist ein ein Memo-Feld. Gespeichert und organisiert wird das ganz von der SQL-Software selbst und zwar in GOTTSEIDANK in EINER Datei. (Ich hab im mein Leben schon 1000 x geflucht weil einer die Memo-Datei vergessen hat.

Was ich mit den ganzen Vortrag sagen will ist. Der Aufbau einer Datenbank ist eine Kunst. Und zwar eine die nur die wenigsten Richtig beherrschen. Das was ein heute noch gigantisch erscheint kann nach einigen Monaten nämlich voll in die Hose gehen. Ich habe wegen VB meine Datenbanken immer in Access aufgebaut. Bis ich mal eine Datenbank hatte die mal > 2 GB war. Und dann hat es Zoomm gemacht. Also weg mit den Toten Mist und auf SQL umgestiegen. MS hat soviel seine Software nur auf Kundendatenbanken eingestellt. Große Datenmengen kannst du damit nicht verarbeiten. (Meine größte Datenbank schafft mal eben 5 GB an Festplattenplatz).

Wenn man nun wie ich es gerne mache die Datenbankabfrage in eine Funktion legt spart mal sich viel Arbeit. z.b. so.

wert = function (Name_der_tabelle, Name_der_spalte_mit den_ergebnis, name_der_spalte_mit_den_Suchwert)
Die Funktion öffnet die Datenbank, führt die Abfrage durch und liefert das Ergebnis. Für einfache Ergebnisse z.b. Grundeinstellungen ist das ideal.

Wie du merkst mag ich Datenbanken. Ich habe damals sogar unter MS-Basic selbst welche entwickelt für meinen Lehrer als Schülerverwaltung (lang lang ist her ;) )

Und dieses XML-Format ist grausig. Ich habe schon jede Menge Pharser geschrieben die diesen Mist wieder in eine Datenbank schreibt.

So ende des Vortrag. Das hier liest eh keiner das weiß ich ;(

Gruß

Pucki
 

GMan

Well-Known Member
Licensed User
Longtime User
Sehr falsch ;-)
Wobei ich mich jetzt frage, warum bei so einer Einstellung dann doch was eingetastet wird :)
 
Top