Italian Salvataggio dati SQL dopo disinstallazione app

latietude

Member
Buongiorno alla stanza! Dalle mie parti si dice così.... Mi sono appena iscritto a questa community che trovo super interessante visto che ho sviluppato una semplice app di prova per testare le mie conoscenze in B4a e premetto che non sono un programmatore ma adoro cimentarmi. La mia app utilizza un database SQL ovviamente aggiunto da codice nella cartella DirAsset e funziona alla perfezione: l'eventuale utente ha la possibilità di inserire dei dati e ritrovarli all'accesso successivo e fino a qui tutto va a meraviglia. Il problema é che, se l'utente disinstalla l'applicazione e poi decide di reinstallarla, anche sullo stesso telefono, i dati vengono persi. Sfogliando tra i vari post del forum ho trovato molte idee per far fronte al problema ma nessuna che sia in grado di risolverlo..... Forse non ho cercato bene? Grazie in anticipo
 

latietude

Member
Buongiorno, ho trovato la soluzione da solo. In pratica bastava installare da codice il database nella cartella interna del telefono, non sapevo che se restasse nella cartella dell'app si sarebbero cancellati i dati. Grazie lo stesso
 

Sagenut

Expert
Licensed User
Longtime User
Benvenuto!
 

LucaMs

Expert
Licensed User
Longtime User
Buongiorno, ho trovato la soluzione da solo. In pratica bastava installare da codice il database nella cartella interna del telefono, non sapevo che se restasse nella cartella dell'app si sarebbero cancellati i dati. Grazie lo stesso
Ciao.

In realtà non è così. Non si può accedere (scriverci) al DB che sta nella DirAssets, da questa devi copiarla alla DirInternal. Qui rimarrà anche se l'utente disinstallerà la tua app (e sarà di nuovo utilizzabile e con i vecchi dati se la reinstallerà), a meno che tu non scriva nel Manifest:

SetApplicationAttribute(android:allowBackup, "false")

nel qual caso verrà eliminato insieme all'app.
 

latietude

Member
Buongiorno...
Domanda: come mai ogni volta che reinstallo l'app con il database nella DirInternal i dati memorizzati la volta prima poi non li ritrovo?
Sul forum di Android ho trovato questo da aggiungere all'Editor Manifest "SetApplicationAttribute(android:hasFragileUserData,"true")" qualcuno lo conosce?
Da quanto ho capito serve per chiedere all'utente se vuole conservare o no i dati registrati prima della disinstallazione dell'app, ed è vero che funziona pero' vorrei che questa opzione venga eseguita in automatico senza dover chiedere. Qualcuno sa dirmi se è possibile?
Grazie in anticipo e buona domenica
 

Sagenut

Expert
Licensed User
Longtime User
Sarebbe sempre meglio, quando possibile, postare il progetto il modo da poterlo provare per replicare il problema e capire cosa succede.
O almeno postare un esempio che mostri lo stesso problema riscontrato.
Nel primo post mi pare di capire che la tua app copia il db interno dalla DirAssets alla DirInternal.
Può essere che non fai un controllo se il file è già esistente e lo sovrascrivi con il db di base incluso con l'app?
 

latietude

Member
Sarebbe sempre meglio, quando possibile, postare il progetto il modo da poterlo provare per replicare il problema e capire cosa succede.
O almeno postare un esempio che mostri lo stesso problema riscontrato.
Nel primo post mi pare di capire che la tua app copia il db interno dalla DirAssets alla DirInternal.
Può essere che non fai un controllo se il file è già esistente e lo sovrascrivi con il db di base anche con l'app?
Ciao e grazie per la risposta alla mia richiesta.
Ho scritto queste righe di codice per fare il controllo, forse non è giusto...

PercorsoFile = File.DirInternal


If File.Exists(PercorsoFile,"BancaDati1.db") = False Then
File.Copy(File.DirAssets,"BancaDati.db", PercorsoFile,"BancaDati1.db")
End if
Prodotti.Initialize(PercorsoFile,"BancaDati1.db",True)
 

Sagenut

Expert
Licensed User
Longtime User
Direi che è corretto.
Magari aggiungi un LOG per vedere il risultato della verifica e capire se ogni volta non trova il file.
B4X:
If File.Exists(PercorsoFile,"BancaDati1.db") = False Then
    Log("File mancante. Copia in corso...")
    File.Copy(File.DirAssets,"BancaDati.db", PercorsoFile,"BancaDati1.db")
Else
    Log("File già presente.")
End if
 

Sagenut

Expert
Licensed User
Longtime User
Suggerimento off topic:
se vuoi sfruttare al meglio il forum puoi fare una donazione a B4X seguendo questo link
https://www.b4x.com/b4a.html
In questo modo diventeresti un Licensed User e non avresti l'attesa della moderazione per vedere pubblicati i tuoi post.
Questo velocizza di molto, sia per te che per chi vuole aiutarti, le discussioni.
 

latietude

Member
Direi che è corretto.
Magari aggiungi un LOG per vedere il risultato della verifica e capire se ogni volta non trova il file.
B4X:
If File.Exists(PercorsoFile,"BancaDati1.db") = False Then
    Log("File mancante. Copia in corso...")
    File.Copy(File.DirAssets,"BancaDati.db", PercorsoFile,"BancaDati1.db")
Else
    Log("File già presente.")
End if
Ok grazie, ci proverò ma se il log confermasse la presenza del file in DirInternal sarei al punto di partenza.
 

Sagenut

Expert
Licensed User
Longtime User
Eventualmente prova così
Aggiungi la libreria RuntimePermissions al progetto.
In Class_Globals o in Process_Globals (dipende se hai fatto un progetto B4XPages o Default) metti
B4X:
Private rp As RuntimePermissions
e poi nel tuo codice
B4X:
PercorsoFile = rp.GetAllSafeDirsExternal("")
If File.Exists(PercorsoFile,"BancaDati1.db") = False Then
    Log("File mancante. Copia in corso...")
    File.Copy(File.DirAssets,"BancaDati.db", PercorsoFile,"BancaDati1.db")
Else
    Log("File già presente.")
End If
In alternativa prova a sostituire
B4X:
File.DirInternal
con
B4X:
XUI.DefaultFolder
Ovviamente deve essere stata aggiunta la libreria XUI al progetto e devi averla dichiarata.
XUI.DefaultFolder dovrebbe essere la stessa identica cosa di File.DirInternal
Ma ho letto un post in cui qualcuno ha risolto così il tuo stesso problema.
Anche se forse il problema era altrove.
 

latietude

Member
Alla fine prova così
Aggiungi la libreria RuntimePermissions al progetto.
In Class_Globals o in Process_Globals (dipende se hai fatto un progetto B4XPages o Default) metti
B4X:
RP privato come RuntimePermissions
e poi nel tuo codice
[CODICE=b4x]PercorsoFile = rp.GetAllSafeDirsExternal("")
Se File.Exists(PercorsoFile,"BancaDati1.db") = False Allora
Log("File mancante. Copia in corso...")
File.Copy(File.DirAssets,"BancaDati.db", PercorsoFile,"BancaDati1.db")
Altro
Log("File già presente.")
Fine se[/CODE]
In alternativa prova a sostituire
[CODICE=b4x]File.DirInterno[/CODICE]
contro
[CODICE=b4x]XUI.CartellaPredefinita[/CODICE]
Ovviamente deve essere stata aggiunta la libreria XUI al progetto e devi averla dichiarata.
XUI.DefaultFolder dovrebbe essere la stessa identica cosa di File.DirInternal
Ma ho letto un post in cui qualcuno ha risolto così il tuo stesso problema.
Anche se forse il problema era altrove.
Niente da fare, mi conferma la presenza del file in DirInternal ma non funziona.
Ho apportato le modifiche che mi hai indicato e continua a perdere i dati, credo che ci sia qualcosa che sovrascrive il database ad ogni reinstallazione..... ma cosa?
 

Sagenut

Expert
Licensed User
Longtime User
Senza avere il tuo progetto intero da testare è difficile da dire.
 

Sagenut

Expert
Licensed User
Longtime User
Il tuo progetto è B4XPages o solo Activity?
Hai solo Main tra le finestre del codice o anche B4XMainpage?
 
Top