German Map.Get macht Parse Fehler bei Boolean

Discussion in 'German Forum' started by Sinan Tuzcu, Feb 28, 2019.

  1. Sinan Tuzcu

    Sinan Tuzcu Active Member Licensed User

    Hallo,

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

    Code:
    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
    Code:
    chkPWFragen.Checked = SettingsMap.Get("PWask")
    bekomme ich Parse Fehler

    wie kann ich das verhindern?
     
  2. GMan

    GMan Well-Known Member Licensed User

    Hast DU für jeden Eintrag in der Map jeweils ein Keyword und den dazu gehörigen Inhalt definiert / korrekt eingelesen ?
     
  3. Sinan Tuzcu

    Sinan Tuzcu Active Member Licensed User

    habe gerade mal 3 Einträge Vorname, Nachname und das mit dem Checkbox
    Code:
    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:
    Code:
    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
     
  4. OliverA

    OliverA Well-Known Member Licensed User

    WriteMap legt alles ab als "Strings" und ReadMap liest alles zurueck als "Strings"

    Code:
    Dim aString as String = SettingsMap.Get("PWask")
    chkPWFragen.Checked = aString.EqualsIgnoreCase(
    "True")
     
    MarkusR and Sinan Tuzcu like this.
  5. Sinan Tuzcu

    Sinan Tuzcu Active Member Licensed User

    super danke dir, jetzt funktioniert es.
     
  6. DonManfred

    DonManfred Expert Licensed 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: Feb 28, 2019
    OliverA likes this.
  7. OliverA

    OliverA Well-Known Member Licensed User

    Komischerweise funktioniert dieses:
    Code:
    Dim aBool as Boolean = SettingsMap.Get("PWask")
     
  8. DonManfred

    DonManfred Expert Licensed User

    Hätte ja dann beim TO auch funktionieren müssen. Da er aber - wie immer - so gut wie keine Quellangaben oder genaue Fehlermeldungen gepostet hat bleibt uns hier nur raten.
     
    GMan and OliverA like this.
  9. Sinan Tuzcu

    Sinan Tuzcu Active Member Licensed 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.
     
  10. GMan

    GMan Well-Known Member Licensed User

    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:
     
  11. RWK

    RWK Member Licensed User

    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
     
  12. MarkusR

    MarkusR Well-Known Member Licensed User

    Mach doch mal ein Feature Request :D
    File.WriteObjectXML
    File.ReadObjectXML
     
  13. pucki

    pucki Active Member Licensed User

    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
     
  14. GMan

    GMan Well-Known Member Licensed User

    Jo, wir Alten machen am liebsten mit DBase-Format rum :cool::D
     
  15. pucki

    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
     
  16. MarkusR

    MarkusR Well-Known Member Licensed User

    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.
     
  17. pucki

    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
     
  18. DonManfred

    DonManfred Expert Licensed User

    Falsch ;-)
     
    OliverA and Sinan Tuzcu like this.
  19. GMan

    GMan Well-Known Member Licensed User

    Sehr falsch ;-)
    Wobei ich mich jetzt frage, warum bei so einer Einstellung dann doch was eingetastet wird :)
     
    OliverA likes this.
  20. pucki

    pucki Active Member Licensed User

    Weil ich mich vor Langeweile hab hinreißen lassen. ;) Sorry.

    Gruß

    Pucki
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice