Android App mit SQLite

Startseite Foren Deutsches LiveCode-Forum Android App mit SQLite

Ansicht von 3 Antwort-Themen
  • Autor
    Beiträge
    • #5001
      wolf
      Teilnehmer

        Hallo zusammen,

        ich habe eine App mit Lese- und Schreibzugriff auf eine SQLite Datenbank erstellt. Diese läuft in der LiveCode-Entwicklungsumgebung und als Windows Standalone völlg korrekt.

        Aber leider unter Android (4.0) nicht:
        Lasse ich die Datenbank beim Starten des Programms unter Android – wie vielfach empfohlen – per Code mit „put url… into url…“ in den Ordner specialFolderPath(„documents“) kopieren, bekomme ich dann beim Zugriff auf die Datenbank die Fehlermeldung „database error, table fragen not found“, obwohl die Tabelle „fragen“ zu 100% sicher in der Datenbank ist.

        Ich habe daher zu Testzwecken die SQLite Datenbank „arbeitsplaner.db“ auf dem Tablet auf die SD Card in den Ordner „/mnt/sdcard/documents/ kopiert. In LiveCode habe ich als Standaloneeinstellungen „Allow external storage“ gewählt und „write external storage“ angekreuzt. Lieder funktionert im unten gezeigten Code die auskommentierte Zeile nicht, die aktive Zeile schon:

        If the environment is „mobile“ then
        — put specialFolderPath(„external documents“) & „/arbeitsplaner.db“ into gDatenPfad
        put „/mnt/sdcard/documents/arbeitsplaner.db“ into gDatenPfad
        else
        put datenOrdner&“arbeitsplaner.db“ into gDatenPfad
        end if

        Weiß jemand, was ich flasch mache bzw. warum specialFolderPath(„external documents“) nicht funktioniert? Vielen Dank für einen weiterführenden Hinweis!

        Wolf

      • #5005
        Klaus Major
        Administrator

          Hallo Wolf,

          das klingt so, als ob beim Kopieren in den Documents Ordner etwas nicht geklappt hat.
          Dann erstellt LC mit „revopendatabase…“ nämlich eine neue und leere Datenbank-Datei, die natürlich noch keine TABLES etc. beinhaltet. Womit die Meldung „Table not found…“ auch wieder nicht gelogen ist.

          Überprüfe mal „the result“ direkt nach dem Kopieren:

          put url („binfile:“ & Datenbank aus Resourcen Ornder) into url („binfile:“ & Datenbank im Dokumenten Ordner)
          if the result <> EMPTY then
          answer „Fehler:“ && the result
          end if

          Wichtig:
          Das Android Betriebsystem ist wie iOS „case-sensitive“, also auf Groß-und Kleinschreibung achten!

          Gruß

          Klaus

        • #5022
          wolf
          Teilnehmer

            Hallo Klaus,

            vielen Dank für Deinen Tipp, der war goldwert. Ich habe schon zwei Tage an diesen Problem herumgefummelt.

            Der Fehler lag in der Tat beim Kopieren: Der Befehl

            put url („binfile:“ & specialFolderPath(„engine“) & „/arbeitsplaner.db“) into url („binfile:“ & specialFolderPath(„documents“) & „/arbeitsplaner.db“)

            hatte wohl eine leere Datenbank im Order „documents“ angelegt. Damit habe ich nicht gerechnet, denn ich hatte angenommen, dass, wenn das Kopieren fehlschlägt, irgendwie eine Fehlermeldung erscheint und im Zielordner keine Datenbank angelegt wird.

            Richtig muss der Kopierbefehl heißen:

            put url („binfile:“ & specialFolderPath(„engine“) & „/daten/arbeitsplaner.db“) into url („binfile:“ & specialFolderPath(„documents“) & „/arbeitsplaner.db“)

            da ich bei den Standalone-Definitionen bei „Copy Files“ den Unterordner „daten“ als Speicherort der Datenbank angegeben hatte. Offenbar reproduziert das APK beim Installieren in Android im Ordner „engine“ die unter „Copy Files“ eingetragene Unterordnerstruktur.

            Einfach, wenn man es weiß …

            Herzlichen Dank!
            Wolfgang

          • #5024
            Klaus Major
            Administrator

              Prima! 🙂

              Wichtiger Tip:
              Gewöhn dir an, specialfolderpath(„resources“) zu benutzen!

              Das ist unter Android und iOS zwar zufällig identisch mit specialfolderpath(„engine“), aber auf dem Desktop eben nicht!

              Und somit müsstest Du in Deinen Skripts bei Bedarf unterscheiden zwischen Paltform Desktop oder Mobile! Dieser Aufwand entfällt mit specialfolderpath(„resources“), der ist wirklich „crossplatform“!

          Ansicht von 3 Antwort-Themen
          • Du musst angemeldet sein, um auf dieses Thema antworten zu können.