Pfade unter Android — Knoten im Gehirn ….

Startseite Foren Deutsches LiveCode-Forum Pfade unter Android — Knoten im Gehirn ….

Schlagwörter: 

Ansicht von 17 Antwort-Themen
  • Autor
    Beiträge
    • #22111
      foto2004
      Teilnehmer

      Hallo Gemeinde,

      irgendwie verstehe ich das mit den Pfaden unter Android nicht. Es ist ein Buch mit 7 Siegel.

      ich habe vollenden Code im mainStack:

      on preOpenStack
         if the environment is "mobile" then
            put specialFolderPath("engine") into programmPfad
         else
            put the filename of this stack into programmPfad
            set the itemDelimiter to "/"
            delete the last item of programmPfad
         end if
         if the environment is "mobile" then
            put specialFolderPath("documents") & "/data/" into dataPfad
         else
            put programmPfad&"/data/" into dataPfad
         end if
         --put programmPfad&"/data/" into dataPfad
         if the platform is "MacOS" and the environment is "standalone application" then
            set the itemDelimiter to "/"
            put the filename of this stack into programmPfad
            put item 1 to -3 of programmPfad into dataPfad
            put "/Resources/_MacOS/data/" after dataPfad
         end if  
         
         put specialFolderPath("documents") & "/data/huhn.db" into tDatabaseFile
         
         if there is not a file tDatabaseFile then
            put url("binfile:" & specialFolderPath("engine") & "/data/huhn.db") into url("binfile:" & specialFolderPath("documents") & "/data/huhn.db")
         else
            answer "There is a file huhn.db"
         end if
         
         set the navigationArrows to false
      end preOpenStack

      wenn ich dann meine App auf das Android Tablett installiere kommt das:

      keine verbindung zur DB..
      Ich habe mir da mal einige Buttons gemacht wo ich die einzelnen Verzeichnisse abrufe.



      ich verstehe zwar dass ich meine DB in den Ordner Documents bringen muss. ….
      aber dann steht ich da wie der Ochse vorm neuen Scheunentor …..

      Kann mir das mal bitte einer erklären, aber bitte eine Erklärung für Dummis damit ich es auch mal kapiere. Bitte verzeiht mir meine Fragerei ich habe erst vor einigen Tagen mit LiveCode angefangen und auf dem englischen Forum habe ich mir schon einiges rausholen könne aber bei diesem Thema best es bei mir aus.

    • #22114
      Klaus Major
      Verwalter

      Hallo Immanuel,

      habe diesen Post gerade erst freigeschaltet, also nicht wundern…

      Ganz wichtig:
      Alles, was wir über den „Copy files“ Tab in den „Standalone Application Settings“ unserer Runtime hinzufügen, finden wir dann in -> specialfolderpath(„resources“)
      ## specialfolderpath(„engine“) ist TABU!

      Dieser specialfolder funktioniert auch schon in der IDE und zeigt auf den Ordner mit dem aktuellen Stack!

      Im App-Package (APK) haben wir keine Schreibrechte, selbst das Öffnen einer Datanbank wird als „Schreiben“ angesehen, daher müssen wior alles, was wir bearbeiten wollen/müssen zuerst in den Dokumentenordner des Users kopieren und dort bearbeien!

      Und da die Ordnerstruktur, sofern überhaupt vorhanden, auf Android niemadem so recht klar ist, MÜSSEN wir mit diversen specialfolderpath Codes arbeiten, da uns LC dieses Verantwortung auf diese Weise abnimmt. LC findet schon den richtigen Ordner!

      Mach es so:

      on preOpenStack 
         ## Von hier kopieren wir die DB
         put specialfolderpath("resources") & "/data/huhn.db" into tResFile
         
         ## Ordner müssen manuell angelegt werden, daher zuerst:
         if the environment = "mobile" then
            put specialFolderPath("documents") & "/data" into dataPfad
            if there is not a folder dataPfad then
               create folder dataPfad
            end if
         end if
         
         ## Und hierhin kopieren wir sie:
         put dataPfad & "/data/huhn.db" into tDocFile
            
         if there is not a file tDocFile then
            put url("binfile:" & tResFile) into url("binfile:" & tDocFile)
         else
            answer "There is a file huhn.db"
         end if
         
         set the navigationArrows to false
      end preOpenStack

      Deine Datenbank findest Du nun in:
      -> specialfolderpath(„documents“) & „/data/huhn.db“

      Gruß

      Klaus

    • #22116
      Klaus Major
      Verwalter

      Am besten erstellst Du Dir eine Funktion, die Dir immer den richtigen Pfad zur DB liefert!

      function dbPfad
        if the environment = "mobile" then
          return (specialfolderpath("documents") & "/data/huhn.db")
        else
        ## IDE:
          return (specialfolderpath("resources") & "/data/huhn.db")
        end if
      end dbPfad
    • #22121
      foto2004
      Teilnehmer

      OK danke Klaus ich schau mir das genau an und versuche es zu verstehen, aber ich denke ich sollte es hinbekommen. Muss nur jetzt alles Wetterfest machen.

    • #22122
      Klaus Major
      Verwalter

      Bei Fragen unbedingt fragen!
      Ich hab noch eine Menge Antworten! 🙂

    • #22131
      foto2004
      Teilnehmer

      OK da hab ich gleich noch eine 😉

      Übrigens das klappt soweit nur habe ich mir da ein Bild eingebunden und wenn ich die Fläche vom Bild anklicke sollte ein Dialog aufgehen um ein Bild auszuwählen, was auch unter IDE OSX und WIN geht aber IOS und Android bekomme ich immer einen Fehler: unrecongnized token: „…pfad ….. /data/bild/answer file“ wenn ich abspeichern möchte. Es tut sich auch kein Fenster auf wo ich ein File auswählen könnte es wird nur die Fläche etwas grau.

      keine Ahnung was ich da beachten muss dass es unter den mobilen Geräten auch geht?

    • #22132
      Klaus Major
      Verwalter

      Auf der mobilen Platform gibt es keinen Dialog wie auf dem Desktop:
      -> answer file „Bitte eine Datei auswählen:“

      Da musst Du den User ein Bild aus seinem Album auswählen lassen mit -> mobilepickphoto

      Oder, falls im „Documents“ Ordner Bilder vorhanden sind, kannst Du dem User ein Listenfeld mit den Dateien im „Documents“ Ordner anzeigen, wo der User ein Bild markieren/auswählen kann.

    • #22136
      foto2004
      Teilnehmer

      OK das klingt logisch. Danke werde ich gleich mal testen, oder doch erst morgen. Sitze schon zu lange davor.

    • #22149
      foto2004
      Teilnehmer

      Guten Morgen,

      hab gerade ein wenig rumprobiert mit dem mobielepickphoto … hab auch deine Anleitung hier gefunden.

      jetzt bekomme ich das bild auf die Card aber wie bekomme ich es aber in meinen „tFileName, damit ich es an der richtigen stelle anzeigen bzw (danke deiner Hilfe) abspeichern kann?

      Anbei meine Versuche 😉

      global programmPfad, dataPfad, connID, tFilename, BildKopie, tFileName, BildKopie
      on mouseUp pButtonNumber
         set the lockloc of the templateimage to true
         set the width of the templateimage to 221
         set the height of the templateimage to 221
         set the left of the templateimage to "10"
         set the top of the templateimage to "10"
         
         if the environment is "mobile" then
            mobilePickPhoto "album"
            put the filename of img "templateimage" into tFileName
            --put last img into tFileName
            --put it into tFileName
         else
            answer file "Bitte ein Bild auswählen" with type "Jpeg,PNG|jpg,png|"
            if the result = "cancel" then
               exit mouseup
            end if
            put it into tFileName
         end if
         
         set filename of image "imgBildNeu" to tFileName
         # 1. Den eigentlichen Dateinamen ohne Pfad herausfinden:
         set itemdel to "/"
         put item -1 of tFileName into dateiname
         # 2. Pfadnamen für die Kopie zusammenbasteln:
         put dataPfad & "bild/" & dateiname into BildKopie
         # 3. Nun die Datei kopieren:
         --put url("binfile:" & tFileName ) into url("binfile:" & BildKopie)
         --set filename of image "imgBildNeu" to BildKopie
         answer tFileName
         # 4. Fertig
      end mouseUp
      
    • #22150
      Klaus Major
      Verwalter

      1. Keine Anfürhrungszeichen bei NUMMERN nötig, hast Du ja teilweise auch gemacht?

      ...
      set the height of the templateimage to 221
      set the left of the templateimage to 10
      set the top of the templateimage to 10
      ...

      2. mobilpickphoto erstellt eine Kopie des ausgewählten Bildes auf der aktuellen Karte!
      Das ist dann -> last image
      3. the templateimage ist ein „virtuelles“ Bild (Vorlage), nach der danach alle neuen Bilder erstellt werden.
      Das bedeutet, es gibt kein -> image „templateimage“!
      Das hier funktioniert also nicht mit dem importieren (im gegensatz zu referenziert!) Bild. Es hat auch keinen Namen, den musst Du oder der User selber angeben:

      ...
      set filename of image "imgBildNeu" to tFileName
      # 1. Den eigentlichen Dateinamen ohne Pfad herausfinden:
      set itemdel to "/"
      put item -1 of tFileName into dateiname
      # 2. Pfadnamen für die Kopie zusammenbasteln:
      put dataPfad & "bild/" & dateiname into BildKopie
      # 3. Nun die Datei kopieren:
      --put url("binfile:" & tFileName ) into url("binfile:" & BildKopie)
      --set filename of image "imgBildNeu" to BildKopie
      answer tFileName
         # 4. Fertig
      ...

      Falls es wirklich eine externe Bilddatei werden soll, musst Du das Bild exportieren, bevor Du „the filename“ irgendeines Bildes zu dem Pfad setzen kannst!

      Bevor ich weiter helfen kann, erzähl mir bitte, was Du mit diesem Bild anfangen möchtest?

      Gruß

      Klaus

    • #22152
      foto2004
      Teilnehmer

      Danke erste mal für die Mühe,

      nun ich möchte ein Bild auswählen (siehe angefügte Bilder, da ist derben dem DataGrid eine Bild-Fläche) und anschließend soll es in den Ordner /data/bild/ abgespeichert werden und der Pfad in die DB eingetragen werden.
      danach soll mann im DataGrid durchblättern und es werde die jeweiligen Daten in den Feldern rechts und dem Bild-Feld (das Bild natürlich) angezeigt werden.

      Das ganze klappt ja auch aber eben nur unter der IDE, WIN und OSX aber eben nicht unter IOS oder Android

      ich hoffe du kannst meinen etwas umständlichen Ausführungen folgen.

    • #22153
      Klaus Major
      Verwalter

      Aha, danke!

      Dann mach es so:

      ...
      if the environment is "mobile" then
         mobilePickPhoto "album"
         ## Oder ASK den user ob des Namens
      
         ## Ich hoffe JPG ist das Defaultformat!?
         put "ein schönes bild.jpg" into tBildname
         put specialfolderpath("documents") & "/" & tBildname into tFileName
         put last img into url("binfile:" & tFileName)
      
         ## Optional:
         ## delete last img
      else
      ## Desktop
      ...
    • #22155
      foto2004
      Teilnehmer

      Dankeschön, so hat das jetzt geklappt aber erst nach dem ich die Pfade manuell erstellt habe.

    • #22156
      Klaus Major
      Verwalter

      Was meinst Du mit: … aber erst nach dem ich die Pfade manuell erstellt habe?

    • #22158
      foto2004
      Teilnehmer

      weil ich doch die Bilder in /data/bild/ haben möchte und diese musst ich erst manuell erstellen.

      Aber es funktioniert. Du bist einfach super. Ich werde dich im mein Abendgebet mit einschließen.

      Muss nur noch beim abspeichern ein paar zufällige Zeichen in den Dateinamen mit einbinden aber dass ist kein Problem. Hans ich als ich das Buch durchgearbeitet habe schon gemacht.

      Danke noch einmal.

    • #22159
      Klaus Major
      Verwalter

      Ach so, selbstredend musst Du meine Beispiel noch an DEIN Projekt anpasssen. 😎

      Muss nur noch beim abspeichern ein paar zufällige Zeichen in den Dateinamen mit einbinden

      Um die Eindeutigkeit des Dateinamens zu garantieren?
      Nimm doch -> the seconds
      Oder auch -> uuid()

      Also:

      put „Ein Bild_“ & the seconds & „.jpg“ into tBildname
      ## Auf diese Weise könntest Du dann später noch das Speicherdatum
      ## des Bildes wieder hearusfinden, sofern nötig!

      put „Ein Bild_“ & uuid() & „.jpg“ into tBildname

      Das garantiert einmalige Dateinamen!

      Und schau Dir auch meine Antwort hierzu an -> mehrzeiliger Text von sqlite in DataGrid?

    • #22161
      foto2004
      Teilnehmer

      Danke das ist eine gute Idee.

      Das mit deiner Antwort auf das mit dem DataGrid muss ich noch ein wenig durchkauen biss ich es verstehe. Wird noch ein paar Tage dauern. Aber danke auch dafür und die Ausführliche Antwort.
      Die Lernkurve hier ist extrem steil und das ist gut so.

    • #22162
      Klaus Major
      Verwalter

      Leider sind Datagrids die komplexesten Objekte in LC, was Skripting angeht!
      Die sehen allerdings sofort gut aus! 😀

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