Italian Nome di DB SQLite max 8 caratteri?

Sabotto

Active Member
Licensed User
Domanda da profano: Il nome di un DB SQLite deve essere max 8 caratteri piu estensione .db?
Sto facendo delle prove, ma se lo chiamo "DBPers.db" o "DBPerson.db" funziona, se lo chiamo "DBPersone.db" o "DataBasePersone.db" mi da errore

B4X:
'in un modulo di codice chiamato "modApp"
Sub Process_Globals
    Public Const NomeDB As String = "DBPerson.db"
End Sub

'In una B4xPage'
Sub AperturaDataBase
   
    If File.Exists(xui.DefaultFolder, modApp.NomeDB) = False Then
        'lo copia da DirAssets (Files) a DirInternal (xui.DefaultFolder)
        File.Copy(File.DirAssets, modApp.NomeDB, xui.DefaultFolder, modApp.NomeDB) 'questa è la linea 78 (vedi log)
    End If
    SQL1.Initialize(xui.DefaultFolder, modApp.NomeDB, True)
    ...
    ...
End Sub

'l'errore cke ottengo quando uso un nome con oltre  8 caratteri è:
Error occurred on line: 78 (pagDatabase)
java.io.FileNotFoundException: /data/user/0/b4a.example/files/virtual_assets/dbpersone.db: open failed: ENOENT (No such file or directory)
    at libcore.io.IoBridge.open(IoBridge.java:496)
    at java.io.FileInputStream.<init>(FileInputStream.java:159)
    ...
    ..
    Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
Ovviamente i 3 DB con i differenti nomi sono tutti nella tab "Files"
E' normale?
 

LucaMs

Expert
Licensed User
Longtime User
Il nome di un DB SQLite deve essere max 8 caratteri piu estensione .db?
no.

Ho avuto lo stesso problema ieri, durante una prova, per caricare un file png appena salvato.
Non me ne sono interessato perché appunto era una prova, ho cambiato directory e via.
Inizio a supporre che ci sia un problema nell'utilizzo di xui.DefaultFolder.


P.S. Ah, no, poi quella prova ha funzionato, ancora usando xui.DefaultFolder.
 
Last edited:

Sabotto

Active Member
Licensed User
per sicurezza ho controllato che i db ci siano effettivamente e ho messo un paio di Log di controllo che danno esito positivo. Non capisco davvero perchè ho l'errore
B4X:
Log(modApp.NomeDB)
If File.Exists(xui.DefaultFolder, modApp.NomeDB) = False Then

    Log("il db esiste in DirAssets?: " & File.Exists(File.DirAssets,modApp.NomeDB))

    File.Copy(File.DirAssets, modApp.NomeDB, xui.DefaultFolder, modApp.NomeDB) 'linea 80
End If

(Log generato)
DBPersone.db
il db esiste in DirAssets?: true
Error occurred on line: 80 (pagDatabase)
java.io.FileNotFoundException: /data/user/0/b4a.example/files/virtual_assets/dbpersone.db: open failed: ENOENT (No such file or directory)
    at libcore.io.IoBridge.open(IoBridge.java:496)
...
 

LucaMs

Expert
Licensed User
Longtime User
Direi che il log lo hai messo maluccio; il "generato" dovrebbe stare all'interno del If-End If, subito dopo il Copy.
E dovresti riposare, perché non devi verificare che esista nel DirAssets - dove c'è sicuramente, corrisponde al tuo Tab Files, la cartella delle risorse, ma se esista nella xui.DefaultFolder.

"Stacca" un po', riprendi tra una mezz'oretta almeno e vedrai che tutto sarà più chiaro.
 

Sabotto

Active Member
Licensed User
No aspetta. Non mi trovo con ciò che dici
Ho ragionato cosi: Siccome l'errore me lo da sul Copy, (è come se lui non trovasse il file in "Files" (quindi in DirAssets)), allora, prima dell'istruzione File.Copy ho messo un Log che mi dice che il file sicuro c'è nel DirAssets.
Log generato l'ho scritto io! (non è codice...), per indicare le linee di Log restituitemi. Te lo riscrivo meglio:

B4X:
Log(modApp.NomeDB) 'primo Log di check
If File.Exists(xui.DefaultFolder, modApp.NomeDB) = False Then

    Log("il db esiste in DirAssets?: " & File.Exists(File.DirAssets,modApp.NomeDB)) ' secondo Log di check

    File.Copy(File.DirAssets, modApp.NomeDB, xui.DefaultFolder, modApp.NomeDB) 'linea 80
End If

************* LINEE CHE MI RITROVO NELLA TAB LOGS ****************
DBPersone.db (primo log)
il db esiste in DirAssets?: true (secondo Log - questo mi assicura che il file ci sia in DirAssets, eppure dopo ho l'errore!!!
Error occurred on line: 80 (pagDatabase)
java.io.FileNotFoundException: /data/user/0/b4a.example/files/virtual_assets/dbpersone.db: open failed: ENOENT (No such file or directory)
at libcore.io.IoBridge.open(IoBridge.java:496)
...
 

LucaMs

Expert
Licensed User
Longtime User
Fa una cosa, altrimenti mi fai diventare più scemo di quanto sia già 😄

Crea un bel moduletto di codice, con una bella routine Init che chiami all'avvio dell'app (B4XMainPage_Create) e pubblicala qui.

Error occurred on line: 80 (pagDatabase)
java.io.FileNotFoundException: /data/user/0/b4a.example/files/virtual_assets/dbpersone.db: open failed: ENOENT (No such file or directory)
Alla riga 80 non è più probabile che tu NON stia copiando un db dalla assets ma tentando di aprirlo, cosa che dovresti fare dalla xui.DefaultFolder?
 

Sabotto

Active Member
Licensed User
Alla riga 80 non è più probabile che tu NON stia copiando un db dalla assets ma tentando di aprirlo, cosa che dovresti fare dalla xui.DefaultFolder?
Ma la riga 80 è questa
B4X:
File.Copy(File.DirAssets, modApp.NomeDB, xui.DefaultFolder, modApp.NomeDB) '
che vuol dire che sto tentando di aprire e non di copiare?
Vabbe ora ti posto un miniprogetto. (In effetti sono prove con un DB SQLite
Eccolo
Se nel modulo modApp chiami il DB "DBPersone.db" dà errore
Se lo chiami "DBPers.db" funziona ed esce la tabella del Database

l'errore si verifica nella sub Sub "AperturaDataBase" del modulo "pagDatabase"
 

Attachments

  • Test.zip
    14.7 KB · Views: 152
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Forse mi è caduto adesso il gettone (i "diversamente giovani" come me conoscono questo modo di dire), mentre iniziavo a creare un progettiino di prova.

Stai lavorando con B4XPages, quindi il file db dovresti metterlo nella cartella Shared Files. Poi, quando lavori in uno dei tre ambienti (B4A, B4J, B4i) dovresti fare CTRL+Click sulla riga di commento:

B4X:
#Region Shared Files
#CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\Files"
'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True
#End Region

A quel punto l'IDE copierà il db dalla Shared alla Files del progetto che stai sviluppando; se ad esempio stai in B4A, verrà copiato nella Files del progetto B4A.

Non so se tu abbia fatto questi passaggi, ma potrebbe essere questo il problema.
 

LucaMs

Expert
Licensed User
Longtime User
Prova quello che allego. Contiene un modulo di codice, modDB, che va "migliorato", adattato anche nel caso in cui tu volessi usare B4J.
Eventualmente, più tardi lo farò io.
Fatto.
 

Attachments

  • OpenSQLiteDBTest.zip
    16 KB · Views: 161
Last edited:

Sabotto

Active Member
Licensed User
Forse mi è caduto adesso il gettone (i "diversamente giovani" come me conoscono questo modo di dire), mentre iniziavo a creare un progettiino di prova.

Stai lavorando con B4XPages, quindi il file db dovresti metterlo nella cartella Shared Files. Poi, quando lavori in uno dei tre ambienti (B4A, B4J, B4i) dovresti fare CTRL+Click sulla riga di commento:

B4X:
#Region Shared Files
#CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\Files"
'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True
#End Region

A quel punto l'IDE copierà il db dalla Shared alla Files del progetto che stai sviluppando; se ad esempio stai in B4A, verrà copiato nella Files del progetto B4A.

Non so se tu abbia fatto questi passaggi, ma potrebbe essere questo il problema.
si, i files sono sia in Files che in Shared Files come puoi vedere anche dal progettino allegato. Ma poi anche il Log mi conferma cio
Fammi sapere se e quando puoi, se anche a te dá lo stesso errore
 

LucaMs

Expert
Licensed User
Longtime User
Log("il db esiste in DirAssets?: " & File.Exists(File.DirAssets,modApp.NomeDB))
restituisce False.

Il motivo è che NomeDB è "DBPersone.db" e, stranamente, se lo cambi in "dbpersone.db" funziona, ovvero tiene conto di maiuscole e minuscole.

Comunque, è alquanto contorto; ti consiglierei di usare il modulo modDB che sta nel progetto che ho allegato e scriverere anche le query là.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
DBPersone.db

java.io.FileNotFoundException: /data/user/0/b4a.example/files/virtual_assets/dbpersone.db: open failed: ENOENT (No such file or directory)

Il sistema oprativo Android fa la differenza tra minuscole e maiuscole sui nomi dei files.
Il db lo hai chiamato DBPersone.db ma nel codice hai scritto dbpersone.db e quindi è ovvio che non lo trova
 

Sabotto

Active Member
Licensed User
Il sistema oprativo Android fa la differenza tra minuscole e maiuscole sui nomi dei files.
Il db lo hai chiamato DBPersone.db ma nel codice hai scritto dbpersone.db e quindi è ovvio che non lo trova
No. Nel codice si chiama DBPersone.db ed anche il. file.
È il log che lo ha scritto tutto minuscolo.
 
Top