App funktioniert nicht unter Android

Startseite Foren Deutsches LiveCode-Forum App funktioniert nicht unter Android

Ansicht von 16 Antwort-Themen
  • Autor
    Beiträge
    • #7593
      Markus_Reich
      Teilnehmer

      Hallo Forum,

      habe eine App erstellt die Werte aus einer SQLite-DB liest und in einem Graph anzeigt. Die DB liegt im selben Verzeichnis. Unter Windows funktioniert die App.

      Habe die APK-Datei auf ein Android – Tablet übertragen und installiert. Hier funktioniert die Anzeige, (das Lesen der DB?), nicht – es erfolgt auch keine Fehlermeldung, wie z.B DB wird nicht gefunden. Wie kann man denn feststellen ob die DB installiert wurde bzw. warum sie nicht gefunden wird?

      Grüße

    • #7595
      Klaus Major
      Verwalter

      Wo genau liegt denn die Datenbank Datei? Innerhalb des APK Bundles haben wir keine Schreibrechte, Du musst sie in den Dokumenten-Ordner kopieren und dort öffnen!

      Ist dem so?
      Gib kurz Laut, dann erkläre ich Dir, wie Du vorgehen musst. 🙂

      Gruß

      Klaus

    • #7607
      Markus_Reich
      Teilnehmer

      Hallo Klaus,

      die App ist so programmiert, dass die DB im selben Verzeichnis liegen soll.
      Unter Windows im selben Verzeichnis wie die *.exe. Hier wird die DB ja gefunden.

      Unter Android kann ich die DB mit dem Total Commander nicht finden. Sie liegt definitiv nicht in ..\Documents.

      Grüße

    • #7608
      Klaus Major
      Verwalter

      Hi Markus,

      Sie liegt definitiv nicht in ..\Documents.

      von selber kriecht sie auch nicht dahin. 🙂
      Die datei liegt noch im PAK Bundle, wo wir nicht schreiben dürfen, und das Oeffnen einer Datenbankdatei wird bereits als Schreiben gewertet.

      Ich nehme an, Du hast die DB-Datei über „Copy files“ in den „Standalone Builder Settings“ hinzugefügt, korrekt?

      Dann musst Du bei Starten der App prüfen, ob diese Datei bereits in den Docs Ordner kopiert wurde, wenn nein, machen, wenn ja, dort öffnen.

      Ungefähr so, am besten „on openstack“

      ...
      ## Deine mitgelieferte DB-Datei innerhalb des APK Package ist hier zu finden:
      put specialfolderpath("resources") & "/deine_db_datei.db" into tQuellDatei
      
      ## Hier muss sie hin, denn hier dürfen wir schreiben!
      put specialfolderpath("documents") & "/deine_db_datei.db" into tZielDatei
      
      ## Check ob Datei schon vorhanden = App startet nicht zum ersten Mal
      ## Noch nicht vorhanden, also rüberkopieren:
      if there is not a file tZielDatei then
         put url("binfile:" & tQuellDatei) into url("binfile:" & tZielDatei)
      end if
      ...

      Nun kannst Du -> tZielDatei mit revOpenDatabase öffnen und benutzen.
      -> specialfolderpath(„documents“) & „/deine_db_datei.db“
      Klar soweit? 🙂

      Gruß

      Klaus

    • #7614
      Markus_Reich
      Teilnehmer

      Hallo Klaus,

      die DB „graphik“ (SQLite DB ohne Endung) ist jetzt in „documents“. Habe diese dorthin kopiert.

      Oeffnen:
      command databaseConnect
      local tDatabasePath, tDatabaseID
      put specialfolderpath(„documents“) & „/graphik“ into tDatabasePath
      put revOpenDatabase(„sqlite“, tDatabasePath, , , , ) into tDatabaseID
      setDatabaseID tDatabaseID
      end databaseConnect

      Lesen:

      command read_database
      local tData

      put 2 into schluessel
      put getDatabaseID() into tDatabaseID
      put „SELECT Monat from Temperaturen WHERE Lfd_Nr=“ & schluessel into tSQL
      — query the database
      put revDataFromQuery(tab,return,tDatabaseID,tSQL) into tMonat
      …….
      end read_database

      Lesen bringt kein Ergebnis.

      Grüße

    • #7615
      Klaus Major
      Verwalter

      Hi Markus,

      wir reden hier vom „Documents“ Ordner auf dem Device, nicht auf dem Desktop!

      die DB „graphik“ (SQLite DB ohne Endung) ist jetzt in „documents“. Habe diese dorthin kopiert.

      Du hast also mein Skript oben benutzt, um bei Bedarf Deine DB Datei in besagten Ordner zu kopieren, korrekt?

      Dann Bitte prüfen, ob „revdatafromquery()“ keinen Error liefert!

      ...
      put revDataFromQuery(tab,return,tDatabaseID,tSQL) into tMonat
      if tMonat begins with "revdberr" then
       answer "Error:" && tMonat
      end if
      ...

      Eventiuell gibt das einen Hinweis.

      Gruß

      Klaus

    • #7616
      Markus_Reich
      Teilnehmer

      Hallo Klaus,

      hatte zuvor nicht das Skript benutzt zum Kopieren der DB.

      Jetzt steht im StackScript:

      on openStack
      ## Deine mitgelieferte DB-Datei innerhalb des APK Package ist hier zu finden:
      put specialfolderpath(„resources“) & „/graphik.db“ into tQuellDatei

      ## Hier muss sie hin, denn hier dürfen wir schreiben!
      put specialfolderpath(„documents“) & „/graphik.db“ into tZielDatei

      ## Check ob Datei schon vorhanden = App startet nicht zum ersten Mal
      ## Noch nicht vorhanden, also rüberkopieren:
      if there is not a file tZielDatei then
      put url(„binfile:“ & tQuellDatei) into url(„binfile:“ & tZielDatei)
      end if
      end openStack

      Der restliche Code, der beim Klick auf die Buttons ausgeführt werden soll, steht im CardScript.
      In den Standalone Application Settings ist unter CopyFiles die graphik.db mit Add Files eingetragen worden.

      Ich übertrage die APK Datei nach My Documents und installiere diese mit den Total Commander. Es kommt eine Meldung Von Play Protect blockiert. Mit Trotzdem installieren wird die App erfolkreich installiert.

      Beim Ausführen der App wird die DB nicht nach documents übertrfagen. Die Fehlermeldung beim Lesen:
      Error revdberr DatabaseError No such table: Temperaturen
      (natürlich ist die Tabelle in der DB)

      Auch ein Kopieren von Hand bringt nichts.

      Grüße

    • #7622
      Klaus Major
      Verwalter

      Hi Markus,

      ich selber besitze weder Handy noch Tabel und entwickle nicht für die mobile Platform.
      Daher kann ich so etwas leider nicht testen.

      Aber ich denke, „My Documents“ ist nicht der „documents“ Ordner Deines Programms.
      Das ist ein abgeschotteter Bereich innerhalb Deines Programms (Sandboxing).

      Mach bitte Folgendes:
      In Deinem Kartenskript prüfen, ob die Datei überhaupt vorhanden ist.
      Wenn sie es nicht ist, erstellt „revopendatabase…“ eine neue und leere Datenbakdatei, in der es die Tabelle „Temperaturen“ natürlich nicht gibt. Und das bedeutet, da ist etwas völlig schiefgelaufen.

      Am bessten beides prüfen:
      1. Das Kopieren der DB Datei selber:

      ...
      if there is not a file tZielDatei then
        put url("binfile:" & tQuellDatei) into url("binfile:" & tZielDatei)
        if the result <> EMTPY then
          anser "Fehler beim Kopieren:" & CR & the result
        end if
      end if
      ...

      2. Im Kartenskript vor „revopendatabase…“

      ...
      put specialfolderpath("documents") & "/graphik.db" into tZielDatei
      if there is NOT a file tZielDatei then
         answer "DB Datei nicht vorhanden!"
         exit to top
      end if
      revopendatabase...
      ...

      Vielleicht gibt das Auskunft darüber, was falsch läuft.

      Gruß

      Klaus

    • #7623
      Klaus Major
      Verwalter

      Vielleicht postest Du auch mal Dein Kartenskript, in dem Du Dich mit der Datenbank verbindest.

    • #7634
      Markus_Reich
      Teilnehmer

      Hallo Klaus,

      hier der Code des Cardscripts:

      [Code]local sDatabaseID

      command setDatabaseID pDatabaseID
      put pDatabaseID into sDatabaseID
      end setDatabaseID

      function getDatabaseID
      return sDatabaseID
      end getDatabaseID

      command databaseConnect
      local tDatabasePath, tDatabaseID

      ## gebraucht wenn db im selben Verzeichnis
      ## set itemDel to „/“
      ## set the defaultFolder to item 1 to -2 of (the effective fileName of this stack)

      ## The database must be in a writeable location
      put specialfolderpath(„documents“) & „/graphik.db“ into tDatabasePath
      put specialfolderpath(„documents“) & „/graphik.db“ into tZielDatei
      if there is NOT a file tZielDatei then
      answer „DB Datei nicht vorhanden!“
      exit to top
      end if
      ## Open a connection to the database
      ## If the database does not already exist it will be created
      put revOpenDatabase(„sqlite“, tDatabasePath, , , , ) into tDatabaseID

      ## Store the database id so other handlers can access it
      setDatabaseID tDatabaseID
      end databaseConnect

      command read_database
      local tData

      put 2 into schluessel
      put 0 into x
      put getDatabaseID() into tDatabaseID
      repeat while schluessel <=13
      add 1 to x
      put „SELECT Monat from Temperaturen WHERE Lfd_Nr=“ & schluessel into tSQL
      — query the database
      put revDataFromQuery(tab,return,tDatabaseID,tSQL) into tMonat

      if tMonat begins with „revdberr“ then
      answer „Error:“ && tMonat
      end if

      put „SELECT Grade_1 from Temperaturen WHERE Lfd_Nr=“ & schluessel into tSQL
      — query the database
      put revDataFromQuery(tab,return,tDatabaseID,tSQL) into tGrade_1
      put „SELECT Grade_2 from Temperaturen WHERE Lfd_Nr=“ & schluessel into tSQL
      — query the database
      put revDataFromQuery(tab,return,tDatabaseID,tSQL) into tGrade_2
      put tMonat & „,“ & tGrade_1 & „,“ & tGrade_2 into tData[x]
      add 1 to schluessel
      end repeat
      put tData[1] & return & tData[2] & return & tData[3] & return & tData[4] & return & tData[5] & return & tData[6] & return & tData[7] & return & tData[8] & return & tData[9] & return &tData[10] & return &tData[11] & return & tData[12] into tData
      set the graphData of widget „Line Graph“ to tData
      end read_database
      [/Code]

      Habe deine oben erwähnten Prüfungen eingebaut. Keine der beiden zeigt eine Meldung.
      Die Fehlermeldung weiterhin:
      Error revdberr DatabaseError No such table: Temperaturen

      Muss die Endeung .db angegeben werden? Spielt Groß-/Kleinschreibung eine Rolle?

      Gruße

    • #7635
      Klaus Major
      Verwalter

      Hallo Markus,

      Muss die Endung .db angegeben werden? Spielt Groß-/Kleinschreibung eine Rolle?

      die Endung ist völlig egal, aber Groß- und Kleinschreibung unter Android und iOS nicht,
      da diese OSse „case-sensitive“ sind“!

      Hm, Skript sieht gut aus, obwohl Du einige unbenutzte Variablen drin hast.
      Kannst Du auch bitte noch einmal das Stackskript posten?

      Hinweis:
      RETURN kannst Du abkürzen als CR, spart Dir sicher eine Menge Tiparbeit 🙂

      Gruß

      Klaus

    • #7636
      Markus_Reich
      Teilnehmer

      Hallo Klaus,

      das Stackscript:

      on openStack
         ## die mitgelieferte DB-Datei innerhalb des APK Package ist hier zu finden:
         put specialfolderpath("resources") & "/graphik.db" into tQuellDatei
         
         ## Hier muss sie hin, denn hier dürfen wir schreiben!
         put specialfolderpath("documents") & "/graphik.db" into tZielDatei
         
         answer tQuellDatei & " - " & tZieldatei
         
         ## Check ob Datei schon vorhanden = App startet nicht zum ersten Mal
         ## Noch nicht vorhanden, also rüberkopieren:
         if there is not a file tZielDatei then
            put url("binfile:" & tQuellDatei) into url("binfile:" & tZielDatei)
            if the result <> EMTPY then
            answer "Fehler beim Kopieren:" & CR & the result
            end if
         end if
      end openStack

      In der Version vor meinem letzten Post war ein Fehler drin (answer), deshalb keine Fehlermeldung. Lasse mir inzwischen die Verzeichnisse anzeigen (auf Android Tablet):

      Quelle: /data/app/com.Softwareentwicklung.Techgraph-1/base.apk/graphik.db
      Ziel: /data/user/0/com.softwareentwicklung.Techgraph/files/graphik.db

      Die Meldung „Fehler beim Kopieren:“ kamm einmal, jetzt nicht mehr. Nur halt die Meldung … Tabelle Temperaturen fehlt …

      Grüße

    • #7637
      Klaus Major
      Verwalter

      Was hat denn die Fehlermeldung angezeigt ausser „Fehler beim kopieren:“?
      DAS müssten wir wissen.

      Ansonsten sieht alles korrekt aus.
      Und Du hast wirklich alles vom Tablet entfernt, bevor Du eine neue APK installiert hast?

    • #7651
      Markus_Reich
      Teilnehmer

      Guten Abend,

      Die Fehlermeldung lautet nur: Fehler beim Kopieren:
      Diese Meldung kommt auch nur beim ersten Start nach dem Installieren.

      Vor einer Neuinstallation habe ich nur die App deinstalliert. Kann eine graphik.db mit dem TotalCommander nicht finden. Den Ordner /data/…. kann ich nicht öffenen mit dem TotalCommander.

      Wieso eigentlich diese Quell- und Zielordner?
      Habe die apk in My Dokuments oder Doawnload kopiert. Das Ziel sollte der graphik.db sollte doch documents sein?

      Grüße

    • #7652
      Klaus Major
      Verwalter

      Hi Markus,

      ups, ich hatte einen Schreibfehler in meinem Skript:

      ## if the result <> EMTPY then
      ## Sollte LEER heissen und nicht LERE!? 😎
      if the result <> EMPTY then

      Bitte korrigieren, noch einmal testen und gucken, ob diese Meldung wieder
      kommt beim ersten Start der App.

      Nur die App zu deinstallieren sollte reichen.

      Leider habe ich keine Ahnung wo und wie genau LC diese diversen specialfolderpath()
      unter ANDROID „mapped“, also wo genau die liegen, tut mir leid.

      Gruß

      Klaus

    • #7661
      Markus_Reich
      Teilnehmer

      Hallo Klaus,

      if the result <> EMPTY then
        answer "Fehler beim Kopieren:" & CR & the result
        end if

      Jetzt kommt die Fehlermeldung nicht mehr.

      Die Ordner unter Win (hier läuft die App):
      Quelle:/MyLiveCode8/Fuenftes_Pr/graphik.db
      Ziel:/Users/xxxxx/Documents/graphik.db

      Hier war zwischenzeilich das Problem, dass im Zielordner eine leere graphik.db angelegt war. Nachdem ich diese gelöscht habe, wird die benötigte kopiert.

      Kann es sein, dass auf Android der Ordner data inkl. Unterordner nicht beschrieben werden können? Mit dem TotalCommander können diese Ordner ja auch nicht geöffnet werden.

      Der Pfadname wird gebildet u.a. aus dem Eintrag in den Standalone Application Settings; Android: Identifier.

      Apps auf meinem Tablet sind m.E. unter Android/data … installiert

      Grüße

    • #7662
      Klaus Major
      Verwalter

      Hallo Markus,

      tut mir leid, so genau kenne ich die Innereien eines mobilen Devices nicht.

      Kann es sein, dass auf Android der Ordner data inkl. Unterordner nicht beschrieben werden können?

      In dem Fall sollte THE RESULT ja eben nicht leer sein und vielleicht einen Hinweis auf diese Tatsache liefern. Sorry, mir gehen die Ideen aus…

      Gruß

      Klaus

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