Problema Folderitem

Ho bisogno di un piccolo aiuto.
Su Mac OS ‘El Capitan’ questo codice funziona, senza aprire la finestra di dialogo per la richiesta del file ‘databasecreator.sqlite’, quindi aprendo direttamente il file contenuto nella cartella dell’applicazione
Su Mac OS ‘Sierra’ invece, apre la finestra di dialogo per la richiesta del file, stesse condizioni, quindi con il file nella cartella dell’applicazione.

?? che differenza c’ tra una versione e l’altra del sistema operativo ??
Perch con El Capitan funziona correttamente e con Sierra no ?

[code]Dim f As FolderItem
f = GetFolderItem(“databasecreator.sqlite”,0)
If f <> Nil and f.exists Then

app.inmemorydb.DatabaseFile = f

else

Dim dlg As OpenDialog
dlg = New OpenDialog
#If Not TargetLinux Then
dlg.InitialDirectory = f
#Else //open Home directory on linux
dlg.InitialDirectory = f
#Endif
dlg.Title = “Seleziona il file ‘databasecreator.sqlite’”
dlg.Filter = FileTypes1.sqlite // “text/plain” file type defined in FileTypes1 set
f = dlg.ShowModal
If f <> Nil Then
app.inmemorydb.DatabaseFile = f
Else
MsgBox(“Operazione interrotta dall’utente”)
quit
End If

end if[/code]

Grazie a tutti per l’aiuto.

L’applicazione sandboxed?

No, non sandboxed

Se capisco giusto, cosa succede usando:

Dim f As FolderItem = app.executableFile.parent.parent.child(“Resources”).child(“databasecreator.sqlite”)
if f <> nil etc.

La struttura delle cartelle questa :

KoalaERP
   +- Koala.app
   +- File1
   +- File2
   +- databasecreator.sqlite

Quindi, esattamente il file va salvato nella stessa cartella dell’applicazione

Purtroppo non capisco cosa significhi KoalaERP.
Ad ogni modo, cerca di raggiungere databasecreator.sqlite alla fine di child(“Resources”). Ovviamente suppongo che i tuoi file siano da qualche parte in “Resources”.
Se fuori da “Resources” allora
Dim f As FolderItem = app.executableFile.parent.parent
oppure
Dim f As FolderItem = app.executableFile.parent
ma suona strano che ci sia del materiale fuori da “Resources”.

Se invece il file sql all’interno di una cartella, allora:
Dim f As FolderItem = app.executableFile.parent.parent.child(“Resources”).child(“cartellaContenenteSqlite”)
if f <> nil and f.exist then
f = f.child(“databasecreator.sqlite”)

L’applicazione si chiama KoalaERP
prova a scaricarla : www.koalaerp.it

Sto scaricando la demo. Ci vooranno alcuni minuti perch sono su connessione lenta.

Non dirmelo, anche qui da me, la connessione fa schifo.
C’ solo ADSL che arriva pi o meno a 2 Mbps, anche se siamo in una cittadina con 30.000 abitanti i cavi telecom sono ancora in rame ricoperti di carta…;
Ora sto utilizzando linkem, che va bene sono in determinati orari del giorno, sembra che tutti gli stranieri utilizzano appunto linkem, e nelle ore di punta il bitrate arriva a meno di 1 Mbps;
Stanno posando la fibra, hanno trasformato in groviera tutte le strade, per posare un tubo vuoto…, tra l’altro parlano di un importo di circa 70/80 euro mensili.

Dopo aver visto la tua cartella contenente app e vari file, ho creato un nuovo progetto con questo snippet nel open event dell’app.

#if not DebugBuild
dim f as FolderItem = GetFolderItem(“databasecreator.sqlite”)
if f <> nil and f.Exists then
MsgBox “found”
else
MsgBox “not found”
end if
#else
MsgBox “Debugging”
#endif

Ho fatto il build dell’app e l’ho messa in una cartella, cos pure il file dtabasecreator.sqlite,
e al lancio dell’app, in Sierra, ottengo Found.
Per cui non so come mai a te non funzioni.

quando in debugging, supponendo che il file Xojo sia nella stessa cartella e allo stesso livello di databasecreator.sqlite:

  • la cartella madre contente i due file:
    –file Xojo su cui lavori
    –databasecreator.sqlite

dim f as folderitem
#if not DebugBuild
f = GetFolderItem(“databasecreator.sqlite”)
#else
dim f as FolderItem = app.ExecutableFile.Parent.Parent.parent.parent.Child(“databasecreator.sqlite”)
#endif

if f <> nil and f.Exists then
MsgBox “found”
else
MsgBox “not found”
end if

scusa, ma oggi forse sono un po’ suonato, ma il seguente snippet lovora sia in debug che per l’app costruita.

  • cartella madre contenente:
    –il file Xojo su cui lavori
    –l’app costruita
    –databasecreator.sqlite

dim f as FolderItem = app.ExecutableFile.Parent.Parent.parent.parent.Child(“databasecreator.sqlite”)
if f <> nil and f.Exists then
MsgBox “found”
else
MsgBox “not found”
end if

L’idea migliore fa copiare il file nelle risorse e leggerlo da li (non credo che lo devi modificare)
Per cui aggiungi un copy step (modalit both)
Ottieni la risorsa (folderitem) con GetResource di Xojo.IO.specialFolder (ricordati di metterlo in un try/catch) e poi la converti in una folderitem classica.

In questo modo non hai differenze tra debug e release.

E’ un file che viene letto una sola volta.
Contiene le tabelle con i dati di base che sono salvati con un restore sul db di Postgre o Mysql,
Una volta letto non servir pi.
Quindi la cosa giusta averlo nella cartella dell’applicazione; oppure se non letto subito, chiedo all’utente di specificare dove !

Mettilo nel risorse (cos come gi ci sono le immagini delle tua app…)