Italian Problema SQLIte

Fulvio75

Well-Known Member
Licensed User
Ciao, ho un problema con sqlite, creo il database come ho sempre fatto e lo metto in assets, mi collego al db e lo vedo nel telefono:

B4X:
Sub SQLConn_Initialize(DBName As String,CreateInExternalDir As Boolean)
    
    Dim rp As RuntimePermissions
    Dim TargetDir As String = ""
    
    'controlla se la dir esterna è scrivibile e se ho scelto di scrivere in tale posizione altrimenti scrivo sulla directory interna (sempre true)
    If File.ExternalWritable = True And CreateInExternalDir = True Then
        TargetDir = rp.GetSafeDirDefaultExternal("")
        DBCreatedExternal = True
    Else
        TargetDir =  File.DirInternal
        DBCreatedExternal = False
    End If
    
    'se il file del db non esiste lo copio dalla cartella assets
    If File.Exists(TargetDir, DBName) = False Then
        File.Copy(File.DirAssets, DBName, TargetDir, DBName)
    End If
    
    'inizializzo la connessione
    SQLConn.Initialize(TargetDir,DBName,True)
    
    SQLConnIsInitialized = SQLConn.IsInitialized
    
End Sub

Eseguo questo codice per creare i settaggi, codice sempre funzionante:

B4X:
'CREO LA TABELLA DELLE IMPOSTAZIONI SE NON ESISTE
        Functions.SQLConn.ExecNonQuery("CREATE TABLE IF NOT EXISTS Settings (Id INTEGER Not Null PRIMARY KEY AUTOINCREMENT UNIQUE,SettingName TEXT,SettingValue TEXT)")

non mi da nessun errore e non crea nulla.

eseguo questo codice per scriverci eventuali nuovi dati sempre funzionante:


B4X:
Functions.SQLConn.ExecNonQuery("UPDATE Settings SET SettingValue = '" & SettingValue & "' WHERE SettingName = '" & SettingName & "'")

non da errori e non fa nulla.

Lo faccio da viewer di sqlite crea tutto e funziona, da b4a non lo fa, sempre usato questo codice e andava, cosa può essere successo?
 

LucaMs

Expert
Licensed User
Longtime User
Regola generale per scovare bug (secondo me!)

Metti qualche Log (ad esempio: Log(TargetDir) <-- cui cambierei nome in DBDir), esegui il progetto in modalità debug premendo F8 (esegue una riga per volta), magari inserisci codice in blocchi Try-Catch e "presto" dovresti scoprire l'errore.


Un paio di suggerimenti:
  1. usa sempre le query parametrizzate (ovvero i metodi SQL con suffisso 2, come ExecQuery2, ExecNonQuery2, etc.)
  2. per ogni progetto che utilizzi db, crea un bella classe con i "comandi"da lanciare, tipo: "Sub ElencaArticoli", "Sub ElencaClienti", etc, scrivendo in questa le query. Di questa classe, crea una sola istanza (variabile oggetto) rendendola pubblica e accessibile da dovunque (la B4XMainPage sarebbe una buona scelta)
 

Fulvio75

Well-Known Member
Licensed User
Regola generale per scovare bug (secondo me!)

Metti qualche Log (ad esempio: Log(TargetDir) <-- cui cambierei nome in DBDir), esegui il progetto in modalità debug premendo F8 (esegue una riga per volta), magari inserisci codice in blocchi Try-Catch e "presto" dovresti scoprire l'errore.


Un paio di suggerimenti:
  1. usa sempre le query parametrizzate (ovvero i metodi SQL con suffisso 2, come ExecQuery2, ExecNonQuery2, etc.)
  2. per ogni progetto che utilizzi db, crea un bella classe con i "comandi"da lanciare, tipo: "Sub ElencaArticoli", "Sub ElencaClienti", etc, scrivendo in questa le query. Di questa classe, crea una sola istanza (variabile oggetto) rendendola pubblica e accessibile da dovunque (la B4XMainPage sarebbe una buona scelta)
Ho fatto il passo passo, esegue tutto regolarmente ma non scrive nel db, ha sempre funzionato, è un copia e incolla da altre app che ho fatto, è cambiato qualche cosa con la nuova release di b4a?
Non da errori come se fosse tutto corretto.
 

Fulvio75

Well-Known Member
Licensed User
Se non dà errori ma ti risulta che non abbia scritto nel db, probabilmente stai controllando il db sbagliato
No perché la connessione punta a quel db ma non scrive nulla, questo è un mistero, ho provato anche insert into tabella, non da errori ma non scrive nulla, ho provato a leggere il dato che ho scritto e non esiste
 

LucaMs

Expert
Licensed User
Longtime User
No perché la connessione punta a quel db ma non scrive nulla, questo è un mistero, ho provato anche insert into tabella, non da errori ma non scrive nulla, ho provato a leggere il dato che ho scritto e non esiste
Proprio per questo penso che tu scriva in un db e poi controlli un altro.
Cmq, prova a mettere qualche query di scrittura (e magari lettura successiva dello stesso record) in un blocco try-catch
 

Fulvio75

Well-Known Member
Licensed User
Proprio per questo penso che tu scriva in un db e poi controlli un altro.
Cmq, prova a mettere qualche query di scrittura (e magari lettura successiva dello stesso record) in un blocco try-catch
Qualche cosa non mi quadra, come faccio a scrivere in un altro db:
SQLConn.Initialize(TargetDir,DBName,True)
uso sempre lo stesso:
SQLConn.ExecNonQuery("CREATE......

SQLConn punta sempre sul db che uso, poi è un copia e incolla da altre app che funzionano, per lo meno compilate con il vecchio b4a, proverò a fare ana app di prova con lo stesso codice.
 

Fulvio75

Well-Known Member
Licensed User
E poi COME verifichi che non vi sia stato scritto alcunché?
Questo è ciò che intendevo, che magari "guardi" (come?) il contenuto di un db diverso da quello in cui scrivi.
Attacco il telefono via USB vado dove c'è il file lo apro e vedo dentro
 

Fulvio75

Well-Known Member
Licensed User
Ecco perché ti ho detto di scrivere Log(TargetDir), per assicurarti che stai leggendo il db giusto; guarda bene il percorso

Hai provato anche una scrittura e subito dopo una lettura di un record (con un log)?
Domani ricontrollo tutto poi ti dico.
 

Fulvio75

Well-Known Member
Licensed User
Incredibile, ho fatto questa prova:
- su telefono clicco il bottone button1 e crea dei record nel dbtest con scritto ciao.
- ho installato questo https://www.b4x.com/android/forum/threads/android-sqlite-viewer.9197/ per vedere il db da telefono
il db lo vedo giusto con i record corretti come dovrebbe essere.
- apro il db da telefono nel percorso dove c'è il db e lo apro da pc collegando il telefono al pc via usb in android/b4a.example (su telefono)
ho provato anche a copiarlo direttamente su pc
- incredibile il db non centra nulla con quello creato è vuoto.

faccio la stessa cosa con i db di app create con una versione precedente di b4a e tutto è normale

non riesco ad allegare il file di esempio, è zip di 800kb mi dice troppo grosso :rolleyes:
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
faccio la stessa cosa con i db di app create con una versione precedente di b4a e tutto è normale
Non ho ancora aggiornato all'ultima versione di B4A ma non credo che c'entri qualcosa.

Cambia nome al package (Build configurations), in modo che non sia quello di default (b4a.example) e riuiscirai a distinguere meglio le cose.
(Già che ci sei, disinstalla l'esempio, ma prima ancora i dati sia dell'app che della cache)
 

Fulvio75

Well-Known Member
Licensed User
Non ho ancora aggiornato all'ultima versione di B4A ma non credo che c'entri qualcosa.

Cambia nome al package (Build configurations), in modo che non sia quello di default (b4a.example) e riuiscirai a distinguere meglio le cose.
(Già che ci sei, disinstalla l'esempio, ma prima ancora i dati sia dell'app che della cache)
ok provo, come faccio ad allegare l'esempio
 

Fulvio75

Well-Known Member
Licensed User
facendo quello che hai detto ora vedo il db corretto però quando eseguo update in sql non fa nessun update, vedo i dati vecchi anche l'app prende i dati vecchi.
 

Fulvio75

Well-Known Member
Licensed User
Allora non capisco come possa superare i 500kb
Togli il file di backup, se c'è
allucinante non li mandava object è divisa in 3 file, questa mattina si è svegliato e scrive le tabelle nel file e modifica il contenuto, però se copio il db dal telefono al pc risulta rigorosamente vuoto... apro con sqlviewer per pc... se lo apro con sql viewer per android su telefono vedo il contenuto.
Lo stesso codice lo copio dentro in una altra app e non funziona più, non crea tabelle non scrive ecc.ecc.
 

Attachments

  • 1.zip
    2.6 KB · Views: 137
  • 3.zip
    1.4 KB · Views: 123
  • object1.zip
    408.1 KB · Views: 124
  • object2.zip
    472.9 KB · Views: 134
  • object3.zip
    502.5 KB · Views: 109
Top