Italian Aggiornamento Versione Database

luciano deri

Active Member
Licensed User
Longtime User
Capita spesso di modificare le tabelle di un database, ho visto che Tramite Sqlite Browser è possibile gestire il Pragmas "user version". Nel caso in cui la versione del database in File.DirAssets sia superiore a quella installata nel dispositivo quale è la procedura migliore per aggiornare tale database senza perdere i dati? Grazie Distinti Saluti.
 

LucaMs

Expert
Licensed User
Longtime User
Questa è una cosa sulla quale dovrei pensare bene anch'io, se e quando mi deciderò a pubblicare... etc.. solito discorso.

Cmq, penso che sia sufficiente mettere un campo in qualche tabella, magari una apposita, tanto che spazio vuoi che occupi, con un numero di versione del DB.

Chiaramente, un conto è aggiungere qualche campo o tabella, altra cosa è apportare modifiche che possano "corrompere" i dati.
 

luciano deri

Active Member
Licensed User
Longtime User
Il pragmas si rileva utile. user version è un parametro impostabile da SqliteBrowser. La soluzione che ho adottato è
B4X:
Sub controllo_versione
    Dim DbVerReq  As Int : DbVerReq  = 2
    Dim DbVerCor  As Int
    DbVerCor = dbSql.ExecQuerySingleResult("PRAGMA user_version")
    dbSql.Initialize(PthMD,"SiscoApp.db",True) 'apro il db installato nel dispositivo
    If Not (DbVerCor = DbVerReq) Then
        'cancello il db corretente, non mi importa dei dati
        File.Delete(PthMD,"SiscoApp.db")
        'carico il db nuovo nel file di installazione
        File.Copy(File.DirAssets,"SiscoApp.db",PthMD,"SiscoApp.db")
        dbSql.Initialize(PthMD,"SiscoApp.db",True)
    End If
End Sub
Nel caso siano fondamentali i dati contenuti nel DB vanno previste sub di recupero dati con trasferimenti tra db con nomi diversi.
 

luciano deri

Active Member
Licensed User
Longtime User
Ma come fate a sapere nel database presente nel'installazione che andate ad aggiornare cosa manca? Anche nel caso in cui ci sia solo da aggiungere una colonna, comunque è una modifica manuale che va fatta solo se non tornano le versioni. Che comunque controllo con user_version.
 

Touch

Active Member
Licensed User
Longtime User
Non puoi utilizzare comandi SQL per inserire o cancellare campi? (Es. Alter, drop ... etc.)
 

luciano deri

Active Member
Licensed User
Longtime User
Esempio: Ho in giro 2 installazioni (A e B), distribuisco un primo aggiornamento della app che prevedo un nuovo campo. L'utente A scarica l'aggiornamento e aggiungo da codice la nuova colonna. Nuovo aggiornamento, nuova colonna e nuova tabella. Il programma capisce la versione del DB che trova in B e fa 2 step di aggiornamento, mentre su A ne fa solo uno. Sempre che sia necessario conservare i dati. Altrimenti chi se ne frega, cancello e ricarico tutto.
 

Touch

Active Member
Licensed User
Longtime User
Esatto. Il controllo lo fai sul numero di versione, e da li controlli, via codice, quante e quali modifiche sono da fare.
Se dovessi strutturare una schedulazione di modifiche farei così:
B4X:
Select numeroVersione
Case 1
       ...fai una modifica
Case 2
       ...fai due modifiche
Case n
       ...fai n modifiche
Case else
       ...Non fare modifiche
End select
 

luciano deri

Active Member
Licensed User
Longtime User
Esatto faccio esattamente questo o quasi. Il numero versione lo leggo con
B4X:
DbVerCor = dbSql.ExecQuerySingleResult("PRAGMA user_version")
e lo confronto con la costante DBVerReq che indica in numero di versione che il sorgente richiede.
 
Top